如何将 Wikidata 导入 Neo4j

我们假设您已阅读 安装指南,并熟悉相关流程。如果尚未阅读,请查看 安装说明入门教程

在本指南中,我们将展示如何使用 Wikidata 查询服务将 Wikidata 导入 Neo4j。具体来说,本文将通过 SPARQL HTTP 端点查询 Wikidata 查询服务,以获取有关国家和大陆的信息。

图配置 (Graph Config)

在将 RDF 数据导入 Neo4j 之前,我们首先需要创建一个图配置,以指导 Neosemantics 如何存储数据。为此,我们需要调用 n10s.graphconfig.init 过程并传入参数映射。正如 入门教程 中所述,我们将使用 n10s 中的映射过程,在将从 Wikidata 获取的数据持久化到 Neo4j 数据库时,自动重命名其中使用的词汇表术语。

根据图配置的不同,Neosemantics 对多值属性的处理方式也会有所不同(多值属性在像 Wikidata 这样的多语言数据集中很常见,例如名称可能有多个值,每种语言对应一个:United Kingdom、Regno Unito、Royaume Uni 等)。默认情况下,Neosemantics 会假设属性是单值的,同一个节点上的同一个属性的新值会覆盖旧值,但在某些情况下,保留所有值是有意义的。我们可以应用配置设置,将这些值以数组形式存储在 Neo4j 中。

CALL n10s.graphconfig.init({
  handleVocabUris: 'MAP', (1)
  handleMultival: 'ARRAY', (2)
  keepLangTag: true, (3)
  keepCustomDataTypes: true, (4)
  applyNeo4jNaming: true (5)
})
1 handleVocabUris 设置为 MAP,指示 Neosemantics 在使用 n10s.nsprefixes.addn10s.mapping.add 过程将模式元素添加到图谱时应用映射。
2 此设置确保多个值在 Neo4j 中以数组形式存储。在本例中,我们关注的是元素在多种语言中的 rdf:label
3 保留语言标签意味着每个翻译后的属性都将带有后缀,例如:United Kingdom@enRegno Unito@it
4 此设置确保任何自定义(用户定义的非 XML 模式)数据类型也会作为字符串保存到 Neo4j 中,后跟其数据类型 URI。
5 应用 Neo4j 推荐的图元素命名规则 - 关系类型使用全大写字母,标签使用大驼峰命名法等。

创建约束

正如我们在教程中所做的,我们需要确保 :Resource 标签节点的 URI 属性上存在唯一约束。

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

构建 SPARQL 查询

为了将数据导入 Neo4j,我们需要首先编写一个查询来从 Wikidata 获取三元组列表。我们将为此使用 SPARQL CONSTRUCT 和 SPARQL DESCRIBE。我们最终的 RDF 查询将返回主体、谓词和客体的三元组信息,这些信息使用来自多个词汇表/模式的术语。事物的唯一标识符和词汇元素起初可能会让人困惑,因为它们都是数字代码,但幸运的是 Wikidata 查询服务带有自动补全功能,我们也可以在 Wikidata.org 上浏览这些三元组。

维基百科(主要供人类阅读)链接到 Wikidata(供程序使用的结构化数据)。如果您浏览维基百科条目,会在左侧导航栏看到一个 Wikidata 数据项 链接。也可以通过键盘快捷键打开:Mac 上是 Ctrl+Option+G

英国 (United Kingdom) 维基百科条目为例,它在 Wikidata 上的引用是 Q145 。Wikidata 条目显示了存储在该项目下的所有三元组的易读表格,包括名称、按年份统计的人口和预期寿命。

我们可以使用 Wikidata 查询服务进行编程访问,通过 DESCRIBE SPARQL 查询返回该元素的所有已知三元组。

describe wd:Q145

总共有超过 800,000 个三元组,因此我们应该更具体地指定我们感兴趣的数据。

Statements 标题下,我们可以看到英国被列为 实例 (wdt:P31),是一个 英联邦王国岛国,最重要的是它是一个主权国家 - Q3624078。我们可以使用这种三元组模式(某事物是主权国家的实例)来识别所有国家,并将它们绑定到 ?country 变量。

SELECT *
WHERE {
  ?country wdt:P31 wd:Q3624078;
    rdfs:label ?countryLabel.
  BIND(LANG(?countryLabel) AS ?countryLabelLang)
}
LIMIT 10

此查询显示查询返回的第一个主体 wd:Q757 具有多种语言的标签。

country(国家) countryLabel(国家标签) countryLabelLang(国家标签语言)

wd:Q16

Kanada

bi

wd:Q16

Kanada

bm

wd:Q16

কানাডা

bn

wd:Q16

ཁ་ན་ཌ།

bo

wd:Q16

কানাডা

bpy

wd:Q16

Kanada

bs

wd:Q16

Канада

bxr

wd:Q16

Canada

cbk-zam

wd:Q16

nā-dâi

cdo

wd:Q16

Канада

之前 n10s.graphconfig.init 调用中的配置设置组合将确保:

  • 这些值在 Neo4j 中作为字符串数组存储 (handleMultival: 'ARRAY')

  • 这些值存储时,语言标签会附加在字符串末尾 (keepLangTag: true)

或者,将 handleMultival 设置为 OVERWRITE 将仅保留单个值。如果我们希望将 Neo4j 中的属性值保持为原子值(而非数组),这将非常有用,但在这种情况下,我们需要在 SPARQL 查询中过滤语言以获取我们感兴趣的那一个。我们可以使用 SPARQL 中的 filter 语句来实现。

filter(lang(?countryLabel) = "en")`

为了演示从谓词导入关系的能力,我们可以将 大陆属性 (wdt:P30) 添加到查询中。在 RDF 中,此属性将国家链接到其所在的大陆。然后我们还添加一个属性,即该国的 人口 (wdt:P1082)。Wikidata 在不同时间点测量某些属性。人口就是其中之一。为了简洁起见,我们不会解释 Wikidata 模型的复杂性,我们将只在查询中添加过滤器,使其仅返回 2010 年之后的人口统计数据,并将每个标签的语言限制为英语、阿拉伯语、俄语和中文。有关更多详细信息,请查看 Wikidata 的文档和示例。

这是更新后的查询

SELECT *
WHERE {
  ?country wdt:P31 wd:Q3624078 ;
    rdfs:label ?countryLabel .
    filter(lang(?countryLabel) IN ("en", "ar", "ru", "zh")) . (1)
  ?country wdt:P30 ?continent .
  ?continent rdfs:label ?continentLabel .
  filter(lang(?continentLabel) IN ("en", "ar", "ru", "zh")) . (1)
  ?country p:P1082 ?populationStatement .
  ?populationStatement ps:P1082 ?population;
    pq:P585 ?date .
  filter(?date > "2010-01-01"^^xsd:dateTime)  (2)
}
LIMIT 10
1 将标签语言过滤为仅包含 enarruzh
2 仅包含 2010 年 1 月 1 日之后的人口数据

然后我们可以使用 WHERE 子句中的信息来构建我们要摄入到 Neo4j 中的三元组。

构建三元组

我们已经看到 SPARQL SELECT 查询返回表格结果,但我们想要的是 RDF 数据。为了指示 Wikidata 查询服务返回三元组,我们可以用 CONSTRUCT 子句替换查询的 SELECT 部分。CONSTRUCT 部分定义了应该如何返回 WHERE 子句中检索到的数据。因此,我们可以使用此部分来重命名某些术语,甚至可以根据需要重构信息。SPARQL CONSTRUCT 查询的输出是主体、谓词和客体三元组的流,它们共同代表一个 RDF 图。

PREFIX neo: <neo4j://voc#> (1)
CONSTRUCT { (2)
  ?country a neo:Country . (3)
  ?country neo:countryName ?countryLabel . (4)
  ?country neo:inContinent ?continent . (5)
  ?continent neo:continentName ?continentLabel . (6)
  ?country neo:hasPopulationCount [ neo:count ?population ; neo:onDate ?date ] . (7)
  ?population a neo:PopulationCount
}
WHERE {
   ?country wdt:P31 wd:Q3624078 ;
    rdfs:label ?countryLabel .
    filter(lang(?countryLabel) IN ("en", "ar", "br", "zh")) .
  ?country wdt:P30 ?continent .
  ?continent rdfs:label ?continentLabel .
  filter(lang(?continentLabel) IN ("en", "ar", "br", "zh")) .
  ?country p:P1082 ?populationStatement .
  ?populationStatement ps:P1082 ?population;
    pq:P585 ?date .
  filter(?date > "2010-01-01"^^xsd:dateTime)
}
LIMIT 10
1 此语句定义了一个 neo4j:// 命名空间。我们将定义新术语(Country、continentName 等),因此必须为它们提供完全限定的 RDF 名称。
2 查询的 CONSTRUCT 部分定义了我们想要的三元组
3 我们将 wd:Q3624078 替换为 neo:Country。Neosemantics 会将此语句转换为国家节点上的 :Country 标签
4 国家节点将拥有一个 countryName 属性(而不是 rdf:label),其中包含该元素的标签
5 该国家将拥有一个指向其大陆的 inContinent 关系,取代 p:P1082
6 大陆将拥有一个对应于 ?continentLabelcontinentName 属性
7 对于人口统计,创建一个三元组来表示与具有日期和统计数值属性的新节点的关系
主体 predicate 客体

wd:Q16

rdf:type

<neo4j://voc#Country>

wd:Q16

<neo4j://voc#countryName>

Canada

wd:Q16

<neo4j://voc#inContinent>

wd:Q49

wd:Q49

<neo4j://voc#continentName>

أمريكا الشمالية

b0

<neo4j://voc#count>

35702707

b0

<neo4j://voc#onDate>

1 January 2015

wd:Q16

<neo4j://voc#hasPopulationCount>

b0

wd:Q16

<neo4j://voc#countryName>

加拿大

预览数据

要预览数据在 Neo4j 中的样子,我们可以使用 n10s.rdf.preview.fetch 过程。在入门指南中,我们使用了静态 URI,但我们可以通过向以下 URL 发送 GET 请求,以编程方式查询 Wikidata 的 API

https://query.wikidata.org/sparql?query=<RDF>

由于 URL 需要查询的编码版本,我们可以使用 APOCapoc.text.urlencode 函数来编码上述 SPARQL 查询。该端点还要求我们发送一个带有我们希望消费的内容类型的 Accept 标头,在本例中为 Turtle

请务必在继续之前安装 APOC 插件并重启 Neo4j。

如果我们使用 n10s.rdf.stream.fetch 过程运行查询,我们可以看到三元组列表以及一些额外的元数据,如数据类型和语言标签。

流式传输 RDF 三元组
WITH 'PREFIX neo: <neo4j://voc#> (1)
CONSTRUCT { (2)
  ?country a neo:Country . (3)
  ?country neo:countryName ?countryLabel . (4)
  ?country neo:inContinent ?continent . (5)
  ?continent neo:continentName ?continentLabel . (6)
  ?country neo:hasPopulationCount [ neo:population ?population ; neo:onDate ?date ] . (7)
  ?population a neo:PopulationCount
}
WHERE {
   ?country wdt:P31 wd:Q3624078 ;
    rdfs:label ?countryLabel .
    filter(lang(?countryLabel) IN ("en", "ar", "br", "zh")) .
  ?country wdt:P30 ?continent .
  ?continent rdfs:label ?continentLabel .
  filter(lang(?continentLabel) IN ("en", "ar", "br", "zh")) .
  ?country p:P1082 ?populationStatement .
  ?populationStatement ps:P1082 ?population;
    pq:P585 ?date .
  filter(?date > "2010-01-01"^^xsd:dateTime)
}
LIMIT 10' AS sparql


CALL n10s.rdf.stream.fetch(
  'https://query.wikidata.org/sparql?query='+ apoc.text.urlencode(sparql),
  'Turtle' ,
  { headerParams: { Accept: "application/x-turtle" } }
)
YIELD subject, predicate, object, isLiteral, literalType, literalLang
RETURN subject, predicate, object, isLiteral, literalType, literalLang
主体 predicate 客体 isLiteral(是否为字面量) literalType(字面量类型) literalLang(字面量语言)

"http://www.wikidata.org/entity/Q712"

"https://w3org.cn/1999/02/22-rdf-syntax-ns#type"

"neo4j://voc#Country"

false

null

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#countryName"

"فيجي"

true

"https://w3org.cn/1999/02/22-rdf-syntax-ns#langString"

"ar"

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#inContinent"

"http://www.wikidata.org/entity/Q538"

false

null

null

"http://www.wikidata.org/entity/Q538"

"neo4j://voc#continentName"

"Oceania"

true

"https://w3org.cn/1999/02/22-rdf-syntax-ns#langString"

"en"

"genid-de0f637b17754c479bbee6732f96f4b1-b0"

"neo4j://voc#population"

"867921.0"

true

"https://w3org.cn/2001/XMLSchema#decimal"

null

"genid-de0f637b17754c479bbee6732f96f4b1-b0"

"neo4j://voc#onDate"

"2011-01-01T00:00:00Z"

true

"https://w3org.cn/2001/XMLSchema#dateTime"

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#hasPopulationCount"

"genid-de0f637b17754c479bbee6732f96f4b1-b0"

false

null

null

"genid-de0f637b17754c479bbee6732f96f4b1-b1"

"neo4j://voc#population"

"874742.0"

true

"https://w3org.cn/2001/XMLSchema#decimal"

null

"genid-de0f637b17754c479bbee6732f96f4b1-b1"

"neo4j://voc#onDate"

"2012-01-01T00:00:00Z"

true

"https://w3org.cn/2001/XMLSchema#dateTime"

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#hasPopulationCount"

"genid-de0f637b17754c479bbee6732f96f4b1-b1"

false

null

null

"genid-de0f637b17754c479bbee6732f96f4b1-b2"

"neo4j://voc#population"

"881065.0"

true

"https://w3org.cn/2001/XMLSchema#decimal"

null

"genid-de0f637b17754c479bbee6732f96f4b1-b2"

"neo4j://voc#onDate"

"2013-01-01T00:00:00Z"

true

"https://w3org.cn/2001/XMLSchema#dateTime"

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#hasPopulationCount"

"genid-de0f637b17754c479bbee6732f96f4b1-b2"

false

null

null

"genid-de0f637b17754c479bbee6732f96f4b1-b3"

"neo4j://voc#population"

"915303.0"

true

"https://w3org.cn/2001/XMLSchema#decimal"

null

"genid-de0f637b17754c479bbee6732f96f4b1-b3"

"neo4j://voc#onDate"

"2016-07-01T00:00:00Z"

true

"https://w3org.cn/2001/XMLSchema#dateTime"

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#hasPopulationCount"

"genid-de0f637b17754c479bbee6732f96f4b1-b3"

false

null

null

"genid-de0f637b17754c479bbee6732f96f4b1-b4"

"neo4j://voc#population"

"905502.0"

true

"https://w3org.cn/2001/XMLSchema#decimal"

null

"genid-de0f637b17754c479bbee6732f96f4b1-b4"

"neo4j://voc#onDate"

"2017-01-01T00:00:00Z"

true

"https://w3org.cn/2001/XMLSchema#dateTime"

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#hasPopulationCount"

"genid-de0f637b17754c479bbee6732f96f4b1-b4"

false

null

null

"http://www.wikidata.org/entity/Q712"

"neo4j://voc#countryName"

"Fiji"

true

"https://w3org.cn/1999/02/22-rdf-syntax-ns#langString"

"en"

当我们想要预览 RDF 源返回的三元组时,fetch 方法非常有用,在本例中是对 Wikidata 的 SPARQL 查询。如果我们想用 Cypher 处理它们,而不是将导入委托给 Neosemantics,它也很有用。

我们还可以在 Neo4j Browser 中使用 n10s.rdf.preview.fetch 过程来将数据作为图进行预览。

将 RDF 预览为属性图
WITH 'PREFIX neo: <neo4j://voc#> (1)
CONSTRUCT { (2)
  ?country a neo:Country . (3)
  ?country neo:countryName ?countryLabel . (4)
  ?country neo:inContinent ?continent . (5)
  ?continent neo:continentName ?continentLabel . (6)
  ?country neo:hasPopulationCount [ neo:population ?population ; neo:onDate ?date ] . (7)
  ?population a neo:PopulationCount
}
WHERE {
   ?country wdt:P31 wd:Q3624078 ;
    rdfs:label ?countryLabel .
    filter(lang(?countryLabel) IN ("en", "ar", "br", "zh")) .
  ?country wdt:P30 ?continent .
  ?continent rdfs:label ?continentLabel .
  filter(lang(?continentLabel) IN ("en", "ar", "br", "zh")) .
  ?country p:P1082 ?populationStatement .
  ?populationStatement ps:P1082 ?population;
    pq:P585 ?date .
  filter(?date > "2010-01-01"^^xsd:dateTime)
}
LIMIT 10' AS sparql

CALL n10s.rdf.preview.fetch(
  'https://query.wikidata.org/sparql?query='+ apoc.text.urlencode(sparql),
  'Turtle' ,
  { headerParams: { Accept: "application/x-turtle" } }
)
YIELD nodes, relationships
RETURN nodes, relationships

查询将返回一组通过 CONSTRUCT 部分中定义的各种关系连接在一起的节点。

preview 1

您可以通过阅读 Wikidata 的 数据访问 (Data access) 页面了解有关访问 Wikidata 的更多信息。

修改输入

使用映射重命名图元素

由于 applyNeo4jNaming 配置选项被设置为 true,Neosemantics 会将关系类型转换为大写。在大多数情况下这没问题,但您可能更喜欢为模式元素创建特定的映射。

在上述预览的情况下,将 neo:inContinent 模式元素转换为大写会产生一个不幸的副作用。与其使用 INCONTINENT,我们可以创建一个映射来为名称添加下划线,使其更具可读性。

为此,我们首先需要为我们在 RDF 查询的 PREFIX 部分中定义的模式和前缀创建一个引用。

CALL n10s.nsprefixes.add('neo', 'neo4j://voc#')

一旦我们创建了模式引用,我们就可以创建从 inContinent 模式元素到 IN_CONTINENT 图元素的映射。

CALL n10s.mapping.add(
  'neo4j://voc#inContinent', (1)
  'IN_CONTINENT' (2)
)
1 需要重命名的模式元素
2 将要创建的关系类型的名称

重新运行上面的 n10s.rdf.preview.fetch 过程,现在应该可以看到那个命名不幸的关系变得更易读了。

preview 2

处理多个值

如果我们看一下查询返回的节点属性,所有内容目前都作为数组存储。这是因为 handleMultival 选项被设置为 ARRAY

如果我们看一下 Country 节点的属性,我们可以看到 countryName 被存储为一个字符串数组。这很好,因为我们想要保留国家的国际名称。

国家属性
{
  "uri": "http://www.wikidata.org/entity/Q16",
  "countryName": [
    "Canada@en",
    "加拿大@zh"
  ]
}

然而,对于 Continent 节点,onDatepopulation 属性永远只会有一个值。

大陆属性
{
  "onDate": [
    "2016-01-01T00:00:00Z"
  ],
  "uri": "genid-0db1342360a44f0f987e27cecb9d4b0a-b8",
  "population": [
    36155487.0
  ]
}

将每个值存储在一个数组中会使查询变得复杂。相反,我们可以通过向 multivalPropList 提供属性键数组来具体指定哪些属性应存储为数组。设置此选项后,任何未明确列出的属性都将被处理,如同我们将 handleMultival 设置为 OVERWRITE 一样,将属性设置为最终值。

要更新图配置,您可以运行 n10s.graphconfig.set,并提供一个更新后的配置选项映射。此过程将用提供的值覆盖当前配置,并返回所有配置选项的流。

CALL n10s.graphconfig.set({
  multivalPropList: ["neo4j://voc#countryName", "neo4j://voc#continentName"]
})

重新运行预览,现在应该可以看到 populationonDate 属性现在被处理为单个值

更新后的大陆属性
{
  "onDate": "2011-01-01T00:00:00Z",
  "uri": "genid-f540b5c1a72c45e591d7bf818f2bf57b-b5",
  "population": 33476688.0
}

countryName 属性仍然持有一个值数组

更新后的国家
{
  "uri": "http://www.wikidata.org/entity/Q16",
  "countryName": [
    "Canada@en",
    "加拿大@zh"
  ]
}

持久化数据

当您对预览感到满意后,可以使用相同的参数运行 n10s.rdf.import.fetch 过程。

WITH 'PREFIX neo: <neo4j://voc#>
CONSTRUCT {
  ?country a neo:Country .
  ?country neo:countryName ?countryLabel .
  ?country neo:inContinent ?continent .
  ?continent neo:continentName ?continentLabel .
  ?country neo:hasPopulationCount [ neo:population ?population ; neo:onDate ?date ] .
  ?population a neo:PopulationCount
}
WHERE {
   ?country wdt:P31 wd:Q3624078 ;
    rdfs:label ?countryLabel .
    filter(lang(?countryLabel) IN ("en", "ar", "br", "zh")) .
  ?country wdt:P30 ?continent .
  ?continent rdfs:label ?continentLabel .
  filter(lang(?continentLabel) IN ("en", "ar", "br", "zh")) .
  ?country p:P1082 ?populationStatement .
  ?populationStatement ps:P1082 ?population;
    pq:P585 ?date .
  filter(?date > "2010-01-01"^^xsd:dateTime)
}
' AS sparql

CALL n10s.rdf.import.fetch(
  'https://query.wikidata.org/sparql?query='+ apoc.text.urlencode(sparql),
  'Turtle' ,
  { headerParams: { Accept: "application/x-turtle" } }
)
YIELD terminationStatus, triplesLoaded, triplesParsed, namespaces, extraInfo
RETURN terminationStatus, triplesLoaded, triplesParsed, namespaces, extraInfo

删除限制应该可以加载并解析超过 32,000 个三元组。

终止状态 三元组已加载 三元组已解析 命名空间 extraInfo(额外信息)

"OK"

32210

32210

null

""

审查图内容

恭喜,您已将 Wikidata 中的数据持久化到了您的图谱中。您现在可以使用如下所示的 Cypher 查询来查看已加载的内容。

MATCH (r:Resource)-[rel]-(x)
WHERE r.uri = 'http://www.wikidata.org/entity/Q46'
RETURN r,rel,x

处理多语言属性

我们提供的配置确保每个 Country 节点的 countryName 属性都是一个值数组,表示该国名称的特定语言版本。如果我们看一下该数组,每个项目都是一个字符串,以该值开头,后跟一个 @ 符号,然后是语言。

{
  "uri": "http://www.wikidata.org/entity/Q902",
  "countryName": [
    "Bangladesh@en",
    "بنغلاديش@ar",
    "Bangladesh@br",
    "孟加拉国@zh"
  ]
}

Neosemantics 提供了一些用于从多语言数据中提取信息的辅助函数

  • n10s.rdf.getLangTag - 给定一个字符串,从字符串末尾提取语言标签

  • n10s.rdf.getLangValue(language, values) - 给定一个值或值数组,提取特定语言的值。

检索特定语言

要检索特定语言的值,可以使用 n10s.rdf.getLangValue 函数。它接受两个参数:语言和值数组。如果代表该语言的字符串存在于值数组中,则返回该值,否则函数将返回 null

MATCH (c:Country)
RETURN c.countryName, n10s.rdf.getLangValue('en', c.countryName) AS englishName
ORDER BY c.countryName ASC
LIMIT 10
c.countryName englishName(英文名)

["Albania@en", "ألبانيا@ar", "Albania@br", "阿尔巴尼亚@zh"]

"Albania"

["Andorra@en", "أندورا@ar", "Andorra@br", "安道尔@zh"]

"Andorra"

["Angola@en", "安哥拉@zh", "أنغولا@ar", "Angola@br"]

"Angola"

["Antigua ha Barbuda@br", "أنتيغوا وباربودا@ar", "Antigua and Barbuda@en", "安提瓜和巴布达@zh"]

"Antigua and Barbuda"

["Armenia@en", "أرمينيا@ar", "亞美尼亞@zh", "Armenia@br"]

"Armenia"

["Bahamas@br", "巴哈马@zh", "باهاماس@ar", "The Bahamas@en"]

"The Bahamas"

["Bahrain@en", "البحرين@ar", "巴林@zh", "Bahrein@br"]

"Bahrain"

["Bangladesh@en", "بنغلاديش@ar", "Bangladesh@br", "孟加拉国@zh"]

"Bangladesh"

["Belarus@br", "Belarus@en", "白俄罗斯@zh", "روسيا البيضاء@ar"]

"Belarus"

["Benin@br", "Benin@en", "贝宁@zh"]

"Benin"

使用 APOC 创建映射

通过使用 模式推导 (Pattern Comprehension),并结合 n10s.rdf.getLangTagn10s.rdf.getLangValue 函数,您可以提取一组 [语言, 值] 对。这可以传递给 apoc.map.fromPairs 以创建一个包含语言作为键、值为值的映射。

MATCH (c:Country {uri: "http://www.wikidata.org/entity/Q145"})
RETURN apoc.map.fromPairs( (3)
  [ name IN c.countryName | (1)
    [ n10s.rdf.getLangTag(name),  n10s.rdf.getLangValue(n10s.rdf.getLangTag(name), name) ]  (2)
  ]
  ) AS countryNames
1 使用模式推导从 countryName 数组中提取临时 name 变量
2 对于每个名称,返回一个包含语言标签(例如:en)和值(例如:United Kingdom)的对
3 将该值传递给 apoc.map.fromPairs 函数,它会将这些对转换为一个映射

这将返回以下输出

{
  "br": "Rouantelezh-Unanet",
  "en": "United Kingdom",
  "ar": "المملكة المتحدة",
  "zh": "英国"
}

结论

在本指南中,我们学习了如何:

  • 使用 Wikidata 查询服务通过 RDF 查询检索数据,并将其导入到 Neo4j 中。

  • 更新 Neosemantics 配置以将特定值存储为数组。

  • 使用 Neosemantics 辅助函数从数组中提取特定的语言数据。

如果您在本教程中遇到任何问题,可以在 故障排除 (Troubleshooting) 页面找到解决方案。

术语表

Neo4j Browser

Neo4j Browser 是一个用于查询、可视化和数据交互的用户界面。如果您的数据库正在运行,它通常可以通过 HTTP 端口 :7474 或 HTTPS 端口 :7473 进行访问,例如 https://:7474

APOC

APOC 是一个过程和函数库,能让您作为 Neo4j 用户的生活更轻松。

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