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,第二个参数设为格式。

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

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

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

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

预览数据

现在已经创建了图配置,我们可以通过更改导入配置参数开始将 RDF 处理为适合属性图的格式。在每次更改后,我们可以使用 n10s.rdf.preview.* 过程来预览对最终属性图的影响。由于我们的 RDF 文档是在线托管的,我们可以使用 n10s.rdf.preview.fetch 从远程 URL 获取 (fetch) RDF。

Fetch
CALL n10s.rdf.preview.fetch(
  'https://raw.githubusercontent.com/neo4j-labs/neosemantics/3.5/docs/rdf/nsmntx.ttl',
  'Turtle'
)
Inline
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 已根据其 rdf:type 成为带有 Neo4jPlugin 标签的节点

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

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

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

映射 (Mappings)

我们可以通过创建映射来更改 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)。请注意,某些三元组可能会根据配置选项进行过滤。

Fetch
CALL n10s.rdf.import.fetch(
  'https://raw.githubusercontent.com/neo4j-labs/neosemantics/3.5/docs/rdf/nsmntx.ttl',
  'Turtle'
)
Inline
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 和格式。

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

Fetch
CALL n10s.rdf.delete.fetch(
  'https://raw.githubusercontent.com/neo4j-labs/neosemantics/3.5/docs/rdf/nsmntx.ttl',
  'Turtle'
)
Inline
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

© . This site is unofficial and not affiliated with Neo4j, Inc.