Neosemantics 入门

我们假设您已阅读安装指南。如果您还没有这样做,请返回并阅读安装说明

现在您已安装插件,是时候开始导入数据了。在本教程中,我们将从一个包含几个 Turtle 格式的三元组的基本 RDF 文档开始。此文件托管在Neosemantics Github 存储库上。

@prefix neo4voc: <http://neo4j.org/vocab/sw#> .
@prefix neo4ind: <http://neo4j.org/ind#> .

neo4ind:nsmntx3502 neo4voc:name "NSMNTX" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.2" ;
			   neo4voc:releaseDate "03-06-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:apoc3502 neo4voc:name "APOC" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.4" ;
			   neo4voc:releaseDate "05-31-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:graphql3502 neo4voc:name "Neo4j-GraphQL" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.3" ;
			   neo4voc:releaseDate "05-05-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:neo4j355 neo4voc:name "neo4j" ;
			   a neo4voc:GraphPlatform , neo4voc:AwesomePlatform ;
			   neo4voc:version "3.5.5" .

RDF 片段描述了四个元素(资源),包括

  • **Neo4j** - 一个图平台,版本属性为 3.5.5

  • **Neosemantics (n10s)** - 一个 Neo4j 插件,版本为 3.5.0.2,于 2019 年 6 月 3 日发布,在 Neo4j 平台上运行

  • **APOC** - 一个 Neo4j 插件,版本为 3.5.0.4,于 2019 年 5 月 31 日发布,在 Neo4j 平台上运行

  • **Neo4j-GraphQL** - 一个 Neo4j 插件,版本为 3.5.0.3,于 2019 年 5 月 5 日发布,在 Neo4j 平台上运行

在 Neo4j 的属性图模型中,资源将成为数据库中的节点,并具有表示版本的属性。neo4voc:runsOn 谓词将成为关系。

总体思路是,对象为字面量值的三元组将成为节点属性,而对象为资源的三元组将成为关系。

创建约束

当 Neosemantics 将 RDF 资源导入 Neo4j 时,它会创建一个节点并自动向其添加 :Resource 标签。为了提高查询效率,需要在标签为 :Resource 的节点的 URI 属性上创建唯一约束。创建约束将确保 URI 在整个数据库中唯一,并且通过其 uri 属性查找 :Resource 节点将使用索引,而不是扫描所有节点以查找相关记录。

CREATE CONSTRAINT n10s_unique_uri FOR (r:Resource)
REQUIRE r.uri IS UNIQUE

图配置

在使用 Neosemantics 运行任何导入操作之前,我们应该使用 n10s.graphconfig.init 过程创建图配置。图配置定义了 RDF 数据在 Neo4j 中的持久化方式。

对于此示例,我们将使用默认值,除了 handleVocabUri 选项。有关配置选项的更多信息,请参阅Neosemantics 参考指南

CALL n10s.graphconfig.init({
  handleVocabUris: 'MAP'
})

默认情况下,handleVocabUri 设置为 SHORTEN - 意味着命名空间以自动生成的字符串为前缀,例如 http://neo4j.org/vocab/sw#Neo4jPlugin 将缩短为 ns0__Neo4jPlugin,同时 ns0 前缀将与命名空间 http://neo4j.org/vocab/sw# 关联。如果我们希望能够再次重新生成 RDF,这将很有用。

在此示例中,我们将 handleVocabUri 参数设置为 MAP,这意味着我们将不缩短命名空间,而是将长 URI 映射到自定义简单名称,从而使属性图更具可读性。

在内联和提取之间进行选择

本教程中的每个函数都具有类似的签名。根据 RDF 查询的来源,您可以使用 .fetch.inline 后缀运行每个过程。如果您的 RDF 托管在远程 URL 上,您可以使用第一个参数作为 URL 和第二个参数作为格式来调用 .fetch 过程。

提取示例
CALL n10s.rdf.preview.fetch(
  '<< YOUR URL >>',
  '<< FORMAT >>'
)

您可以使用 .inline 过程将 RDF 复制并粘贴到查询中。此过程期望将 RDF 查询或片段作为第一个参数,并将格式作为第二个参数。

内联示例
CALL n10s.rdf.preview.inline(
  '<< YOUR RDF QUERY HERE >>',
  '<< FORMAT >>'
)

您可以通过切换下面的代码示例来查看两种过程之间的区别。

预览数据

现在图配置已创建,我们可以通过更改导入配置参数开始将 RDF 转换为适合属性图的格式。在每次更改后,我们可以使用 n10s.rdf.preview.* 过程预览对结果属性图的影响。由于我们的 RDF 文档托管在网上,因此我们可以使用 n10s.rdf.preview.fetch 从远程 URL 提取 RDF。

提取
CALL n10s.rdf.preview.fetch(
  'https://raw.githubusercontent.com/neo4j-labs/neosemantics/3.5/docs/rdf/nsmntx.ttl',
  'Turtle'
)
内联
CALL n10s.rdf.preview.inline(
  '
@prefix neo4voc: <http://neo4j.org/vocab/sw#> .
@prefix neo4ind: <http://neo4j.org/ind#> .

neo4ind:nsmntx3502 neo4voc:name "NSMNTX" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.2" ;
			   neo4voc:releaseDate "03-06-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:apoc3502 neo4voc:name "APOC" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.4" ;
			   neo4voc:releaseDate "05-31-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:graphql3502 neo4voc:name "Neo4j-GraphQL" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.3" ;
			   neo4voc:releaseDate "05-05-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:neo4j355 neo4voc:name "neo4j" ;
			   a neo4voc:GraphPlatform , neo4voc:AwesomePlatform ;
			   neo4voc:version "3.5.5" .
  ',
  'Turtle'
)

preview 3

Neosemantics 对 RDF 数据进行了以下转换

  • neo4j355 已成为一个具有两个标签的节点:GraphPlatformAwesomePlatform,每个 rdf:type 语句一个

    • 该节点具有 http://neo4j.org/ind#neo4j355 的 URI 属性(资源的 URI)

    • neo4voc:nameneo4voc:version 已剥离命名空间并作为节点上的属性分配

  • nsmntx3502apoc3502graphql3502 已成为具有 Neo4jPlugin 标签的节点,基于它们的 rdf:type

    • neo4voc:versionneo4voc:releaseDateneo4voc:runsOn 已剥离命名空间并转换为这些节点上的属性

  • GraphPlatform 节点和每个 Neo4jPlugin 节点之间创建了一个关系,类型为 runsOn

您还可以使用 n10s.rdf.preview.inline(rdf: string, format: string),将 RDF 作为第一个参数传递,并将格式作为第二个参数传递。

映射

我们可以通过创建**映射**来更改 Neosemantics 分配给图模式元素(属性名称、关系类型或节点标签)的名称。例如,您可能希望更改在 Neo4jPluginGraphPlatform 之间创建的关系的类型。

首先,我们需要确保 Neosemantics 了解命名空间。为此,我们使用 n10s.nsprefixes.add 过程。此过程需要两个参数

  1. 命名空间的前缀

  2. 命名空间的完整 URI

在此示例中,http://neo4j.org/vocab/sw# 命名空间将映射到 neo4voc

CALL n10s.nsprefixes.add(
    'neo4voc', (1)
    'http://neo4j.org/vocab/sw#' (2)
)
1 从现在开始,我们将使用neo4voc作为命名空间的前缀。
2 完整命名空间为http://neo4j.org/vocab/sw#

现在我们可以为该命名空间中的词汇元素创建映射。我们使用n10s.mapping.add过程来实现。此过程接受两个参数

  1. 模式元素的完整URI(包括命名空间部分)

  2. 模式元素在图中应重命名的值

由于我们希望将neo4voc:runsOn元素重命名为RUNS_ON,因此可以运行以下过程

CALL n10s.mapping.add(
  'http://neo4j.org/vocab/sw#runsOn', (1)
  'RUNS_ON' (2)
)
1 runsOn RDF谓词的完整URI
2 将在Neo4j中持久化的关系的名称

重新运行上面的预览查询现在应该显示关系类型已从runsOn重命名为RUNS_ON

preview 4

您还可以使用n10s.nsprefixes.addFromText过程从RDF文档中提取命名空间,并将文档的头部部分(通常在其中找到命名空间定义)作为参数传递。

导入数据

导入过程的签名类似于预览 - 您只需将preview替换为import即可。区别在于,此过程将数据持久化到Neo4j中,而预览过程仅显示导入RDF的结果,而不会对图产生任何影响。运行以下Cypher查询应该会运行导入并返回执行摘要,包括导入是否成功或失败(terminationStatus)、从RDF源有效持久化到Neo4j中的三元组数量(triplesLoaded)、在RDF源中解析的三元组数量(triplesParsed)。请注意,根据配置选项可能会过滤掉一些三元组。

提取
CALL n10s.rdf.import.fetch(
  'https://raw.githubusercontent.com/neo4j-labs/neosemantics/3.5/docs/rdf/nsmntx.ttl',
  'Turtle'
)
内联
CALL n10s.rdf.import.inline(
  '
@prefix neo4voc: <http://neo4j.org/vocab/sw#> .
@prefix neo4ind: <http://neo4j.org/ind#> .

neo4ind:nsmntx3502 neo4voc:name "NSMNTX" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.2" ;
			   neo4voc:releaseDate "03-06-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:apoc3502 neo4voc:name "APOC" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.4" ;
			   neo4voc:releaseDate "05-31-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:graphql3502 neo4voc:name "Neo4j-GraphQL" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.3" ;
			   neo4voc:releaseDate "05-05-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:neo4j355 neo4voc:name "neo4j" ;
			   a neo4voc:GraphPlatform , neo4voc:AwesomePlatform ;
			   neo4voc:version "3.5.5" .
  ',
  'Turtle'
)
终止状态 加载的三元组数 解析的三元组数 命名空间 额外信息 调用参数

确定

19

19

{}

导出数据

Neosemantics提供了两种方法将数据从Neo4j导出回RDF格式。

使用Cypher n10s.rdf.export过程

这是一项实验性功能。该过程可能会在将来发生变化。

您可以使用n10s.rdf.export.cypher过程将Cypher查询的结果导出为RDF三元组。该过程将Cypher语句作为第一个参数,以及一个可选的参数映射。查询结果是三元组流。

CALL n10s.rdf.export.cypher("MATCH (p:GraphPlatform) RETURN p")
主题 谓词 宾语 是否为字面量 字面量类型 字面量语言

"http://neo4j.org/ind#neo4j355"

"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"

"neo4j://vocabulary#AwesomePlatform"

错误的

空值

空值

"http://neo4j.org/ind#neo4j355"

"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"

"neo4j://vocabulary#GraphPlatform"

错误的

空值

空值

"http://neo4j.org/ind#neo4j355"

"neo4j://vocabulary#version"

"3.5.5"

真的

"http://www.w3.org/2001/XMLSchema#string"

空值

"http://neo4j.org/ind#neo4j355"

"neo4j://vocabulary#name"

"neo4j"

真的

"http://www.w3.org/2001/XMLSchema#string"

空值

使用HTTP端点

neosemantics插件还在Neo4j服务器上公开了一个HTTP端点。要启用此功能,您必须将以下行添加到Neo4j安装的conf/目录中的neo4j.conf文件中。

dbms.unmanaged_extension_classes=n10s.endpoint=/rdf

重新启动数据库后,将把一个端点挂载到Neo4j服务器。如果您的服务器托管在本地主机上,则应该能够向DATABASE/describe/[URI]发送GET请求,将[DATABASE]替换为数据库的名称,并将[URI]替换为RDF资源的完整URI的URL编码版本。

例如,要导出http://neo4j.org/ind#neo4j355资源的RDF表示,我们可以在Neo4j浏览器中运行以下命令

:GET http://localhost:7474/rdf/neo4j/describe/http%3A%2F%2Fneo4j.org%2Find%23neo4j355

这将为我们提供以下RDF输出

@prefix neovoc: <neo4j://vocabulary#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<http://neo4j.org/ind#neo4j355> a neovoc:AwesomePlatform, neovoc:GraphPlatform;
  neovoc:name "neo4j";
  neovoc:version "3.5.5" .

<http://neo4j.org/ind#apoc3502> neovoc:RUNS_ON <http://neo4j.org/ind#neo4j355> .

<http://neo4j.org/ind#graphql3502> neovoc:RUNS_ON <http://neo4j.org/ind#neo4j355> .

<http://neo4j.org/ind#nsmntx3502> neovoc:RUNS_ON <http://neo4j.org/ind#neo4j355> .

删除三元组数据

要从我们的Neo4j图中删除RDF数据,我们可以使用n10s.rdf.delete.fetch过程。与预览和导入过程一样,它接受两个参数:RDF查询的URL和格式。

例如,要删除我们在导入步骤中加载的数据,可以运行以下查询

提取
CALL n10s.rdf.delete.fetch(
  'https://raw.githubusercontent.com/neo4j-labs/neosemantics/3.5/docs/rdf/nsmntx.ttl',
  'Turtle'
)
内联
CALL n10s.rdf.delete.inline(
  '
@prefix neo4voc: <http://neo4j.org/vocab/sw#> .
@prefix neo4ind: <http://neo4j.org/ind#> .

neo4ind:nsmntx3502 neo4voc:name "NSMNTX" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.2" ;
			   neo4voc:releaseDate "03-06-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:apoc3502 neo4voc:name "APOC" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.4" ;
			   neo4voc:releaseDate "05-31-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:graphql3502 neo4voc:name "Neo4j-GraphQL" ;
			   a neo4voc:Neo4jPlugin ;
			   neo4voc:version "3.5.0.3" ;
			   neo4voc:releaseDate "05-05-2019" ;
			   neo4voc:runsOn neo4ind:neo4j355 .

neo4ind:neo4j355 neo4voc:name "neo4j" ;
			   a neo4voc:GraphPlatform , neo4voc:AwesomePlatform ;
			   neo4voc:version "3.5.5" .
  ',
  'Turtle'
)
终止状态 删除的三元组数 命名空间 额外信息

"确定"

19

空值

""

结论

在本教程中,我们学习了如何

  • 准备Neo4j和Neosemantics以导入RDF数据

  • 创建图配置

  • 使用n10s.rdf.preview.fetch预览来自远程源的RDF数据

  • 使用n10s.rdf.import.fetch导入RDF数据

  • 使用Cypher语句(n10s.rdf.export.cypher)和HTTP端点将图数据导出回RDF

  • 使用n10s.rdf.delete.fetch从图中删除RDF数据

现在您已经熟悉了Neosemantics中提供的过程,我们可以继续学习更具体的示例,将Wikidata导入Neo4j