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 映射为自定义的简单名称,使属性图更具可读性。

选择 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 获取 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` 已成为一个节点,带有两个标签:`GraphPlatform` 和 `AwesomePlatform`,每个 `rdf:type` 语句对应一个。

    • 该节点具有 URI 属性 `http://neo4j.org/ind#neo4j355`(资源的 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 作为第一个参数传递,将格式作为第二个参数。

映射

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

首先,我们需要确保 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 服务器。如果您的服务器托管在本地主机上,您应该能够向 `http://localhost:7474/rdf/DATABASE/describe/[URI]` 发送 `GET` 请求,其中 `[DATABASE]` 替换为数据库的名称,`[URI]` 替换为 RDF 资源的完整 URI 的 URL 编码版本。

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

: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'
)
终止状态 已删除三元组 命名空间 额外信息

"OK"

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

© . All rights reserved.