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 谓词将成为一种关系。
| 基本思想是:以字面值(literal)作为对象的三元组将成为节点属性,而以资源作为对象的三元组将成为关系。 |
创建约束
当 Neosemantics 将 RDF 资源导入 Neo4j 时,它会创建一个节点并自动为其添加 :Resource 标签。为了使我们的查询高效,需要对具有 :Resource 标签的节点的 URI 属性设置唯一约束。创建约束将确保 URI 在整个数据库中是唯一的,并且在按 uri 属性查找 :Resource 节点时,将使用索引,而不是扫描所有节点来查找相关记录。
CREATE CONSTRAINT n10s_unique_uri FOR (r:Resource)
REQUIRE r.uri IS UNIQUE
图配置 (Graph Config)
在运行 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 映射为自定义的简单名称,从而使属性图更具可读性。
在 Inline 和 Fetch 之间进行选择
本教程中的每个函数都有类似的签名。根据您的 RDF 查询来源,您可以在每个过程后面加上 .fetch 或 .inline 后缀。如果您的 RDF 托管在远程 URL 上,则可以使用 .fetch 过程,并将第一个参数设为 URL,第二个参数设为格式。
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 获取 (fetch) 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'
)

Neosemantics 对 RDF 数据执行了以下转换
-
neo4j355已成为一个带有两个标签的节点:GraphPlatform和AwesomePlatform(每个 rdf:type 语句对应一个标签)-
该节点具有
http://neo4j.org/ind#neo4j355的 URI 属性(资源的 URI) -
neo4voc:name和neo4voc:version已被剥离命名空间并分配为节点上的属性
-
-
nsmntx3502、apoc3502和graphql3502已根据其 rdf:type 成为带有Neo4jPlugin标签的节点-
neo4voc:version、neo4voc:releaseDate和neo4voc:runsOn已被剥离命名空间并转换为这些节点上的属性
-
-
在
GraphPlatform节点与每个Neo4jPlugin节点之间创建了一个类型为runsOn的关系
您还可以使用 n10s.rdf.preview.inline(rdf: string, format: string),并将 RDF 作为第一个参数,格式作为第二个参数传递。 |
映射 (Mappings)
我们可以通过创建映射来更改 Neosemantics 分配给图模式元素(属性名称、关系类型或节点标签)的名称。例如,您可能希望更改在 Neo4jPlugin 和 GraphPlatform 之间创建的关系类型。
首先,我们需要确保 Neosemantics 识别该命名空间。为此,我们使用 n10s.nsprefixes.add 过程。此过程接受两个参数
-
命名空间的前缀
-
命名空间的完整 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 过程来完成此操作。此过程接受两个参数
-
模式元素的完整 URI(包括命名空间部分)
-
模式元素在图中应重命名为的值
由于我们想将 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。

您还可以使用 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'
)
| 终止状态 | 三元组已加载 | 三元组已解析 | 命名空间 | extraInfo | callParams |
|---|---|---|---|---|---|
OK |
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")
| 主体 | predicate | 客体 | isLiteral | literalType | literalLang |
|---|---|---|---|---|---|
"http://neo4j.org/ind#neo4j355" |
"https://w3org.cn/1999/02/22-rdf-syntax-ns#type" |
"neo4j://vocabulary#AwesomePlatform" |
false |
null |
null |
"http://neo4j.org/ind#neo4j355" |
"https://w3org.cn/1999/02/22-rdf-syntax-ns#type" |
"neo4j://vocabulary#GraphPlatform" |
false |
null |
null |
"http://neo4j.org/ind#neo4j355" |
"neo4j://vocabulary#version" |
"3.5.5" |
true |
"https://w3org.cn/2001/XMLSchema#string" |
null |
"http://neo4j.org/ind#neo4j355" |
"neo4j://vocabulary#name" |
"neo4j" |
true |
"https://w3org.cn/2001/XMLSchema#string" |
null |
使用 HTTP 端点
neosemantics 插件还在 Neo4j 服务器上公开了一个 HTTP 端点。要启用此功能,您必须将以下行添加到 Neo4j 安装的 conf/ 目录中的 neo4j.conf 文件中。
dbms.unmanaged_extension_classes=n10s.endpoint=/rdf
重启数据库后,一个端点将被挂载到 Neo4j 服务器。如果您的服务器托管在 localhost 上,您应该能够向 DATABASE/describe/[URI] 发送 GET 请求,其中将 [DATABASE] 替换为数据库名称,将 [URI] 替换为 RDF 资源完整 URI 的 URL 编码版本。
例如,要导出 http://neo4j.org/ind#neo4j355 资源的 RDF 表示,我们可以在 Neo4j Browser 中运行以下命令
:GET https://:7474/rdf/neo4j/describe/http%3A%2F%2Fneo4j.org%2Find%23neo4j355
这将为我们提供以下 RDF 输出
@prefix neovoc: <neo4j://vocabulary#> .
@prefix rdf: <https://w3org.cn/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'
)
| 终止状态 | triplesDeleted | 命名空间 | extraInfo |
|---|---|---|---|
"OK" |
19 |
null |
"" |
结论
在本教程中,我们学习了如何:
-
准备 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