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'
)
Neosemantics 对 RDF 数据进行了以下转换
-
neo4j355
已成为一个具有两个标签的节点:GraphPlatform
和AwesomePlatform
,每个 rdf:type 语句一个-
该节点具有
http://neo4j.org/ind#neo4j355
的 URI 属性(资源的 URI) -
neo4voc:name
和neo4voc:version
已剥离命名空间并作为节点上的属性分配
-
-
nsmntx3502
、apoc3502
和graphql3502
已成为具有Neo4jPlugin
标签的节点,基于它们的 rdf:type-
neo4voc:version
、neo4voc:releaseDate
和neo4voc:runsOn
已剥离命名空间并转换为这些节点上的属性
-
-
在
GraphPlatform
节点和每个Neo4jPlugin
节点之间创建了一个关系,类型为runsOn
您还可以使用 n10s.rdf.preview.inline(rdf: string, format: string) ,将 RDF 作为第一个参数传递,并将格式作为第二个参数传递。 |
映射
我们可以通过创建**映射**来更改 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'
)
终止状态 | 加载的三元组数 | 解析的三元组数 | 命名空间 | 额外信息 | 调用参数 |
---|---|---|---|---|---|
确定 |
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