如何将 Wikidata 导入 Neo4j
在本指南中,我们将向您展示如何使用 Wikidata 查询服务 将 Wikidata 导入 Neo4j。具体来说,本文将使用 SPARQL HTTP 端点查询 Wikidata 查询服务以检索有关国家和洲的信息。
图配置
在我们将 RDF 数据导入 Neo4j 之前,我们需要先创建一个图配置来指示 Neosemantics 如何存储数据。为此,我们需要使用参数映射调用 n10s.graphconfig.init
过程。与 入门教程 一样,我们将使用 n10s 中的映射过程来自动重命名从 Wikidata 检索的数据中使用的词汇术语,这些术语在持久化到我们的 Neo4j 数据库时会被使用。
根据图配置,Neosemantics 将以不同的方式处理多值属性(多值属性是像 Wikidata 这样的多语言数据集的常见特征,在 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.add 和 n10s.mapping.add 过程在将模式元素添加到图时应用映射。 |
2 | 此设置可确保在 Neo4j 中将多个值存储为数组,在本例中,我们对元素在多种语言中的 rdf:label 感兴趣。 |
3 | 保留语言标签意味着每个翻译后的属性都会带后缀,例如:United Kingdom@en 或 Regno Unito@it |
4 | 此设置可确保在 Neo4j 中将任何自定义(用户定义的非 XML 模式)数据类型也存储为字符串,后跟其数据类型 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
。
我们可以使用 Wikidata 查询服务 进行编程访问以使用 DESCRIBE
SPARQL 查询返回该元素的所有已知三元组。
describe wd:Q145
总共有超过 800,000 个三元组,所以我们可能应该更具体地说明我们特别感兴趣的数据。
在 **语句** 标头下,我们可以看到英国被列为 实例 (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 |
Gă |
nā-dâi |
cdo |
wd:Q16 |
Канада |
先前 n10s.graphconfig.init
调用的配置设置组合将确保
-
这些值在 Neo4j 中存储为字符串数组 (
handleMultival: 'ARRAY'
) -
这些值将与附加到字符串末尾的语言一起存储 (
keepLangTag: true
)
或者,将
|
为了演示从谓词导入关系的能力,我们可以将 洲属性 (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 | 将标签的语言过滤为仅包含 en 、ar 、ru 和 zh |
2 | 仅包含 2010 年 1 月 1 日之后的人口统计数据 |
然后,我们可以使用 WHERE
子句中的信息构建我们的三元组,准备将其导入 Neo4j。
构建三元组
我们已经看到 SPARQL SELECT 查询返回表格结果,但我们想要获得 RDF 数据。为了指示 Wikidata 查询服务返回三元组,我们可以将查询的 SELECT
部分替换为 CONSTRUCT
子句。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:// 命名空间。我们将定义新的术语(国家、大陆名等),因此需要在 RDF 中为它们提供完全限定的名称。 |
2 | 查询的 CONSTRUCT 部分定义了我们想要创建的三元组。 |
3 | 我们将 wd:Q3624078 替换为 neo:Country 。Neosemantics 会将此语句转换为国家节点上的 :Country 标签。 |
4 | 国家节点将具有 countryName 属性(而不是 rdf:label ),其值为元素的标签。 |
5 | 国家将与它所属的大陆建立 inContinent 关系,替换 p:P1082 。 |
6 | 大陆将具有 continentName 属性,对应于 ?continentLabel 。 |
7 | 对于人口计数,创建一个三元组来表示与新节点的关系,该节点具有日期和计数的属性。 |
主体 | 谓词 | 客体 |
---|---|---|
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> |
2015年1月1日 |
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 需要查询的编码版本,我们可以使用 APOC 的 apoc.text.urlencode
函数来对上面的 SPARQL 查询进行编码。该端点还要求我们发送一个 Accept
标头,其中包含我们想要使用的内容类型,在本例中为 Turtle
。
在继续之前,请确保已安装 APOC 插件并重启 Neo4j。
如果我们使用 n10s.rdf.stream.fetch
过程运行查询,就可以看到三元组列表以及一些额外的元数据,例如数据类型和语言标签。
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
主体 | 谓词 | 客体 | isLiteral | literalType | literalLang |
---|---|---|---|---|---|
"http://www.wikidata.org/entity/Q712" |
"http://www.w3.org/1999/02/22-rdf-syntax-ns#type" |
"neo4j://voc#Country" |
false |
null |
null |
"http://www.wikidata.org/entity/Q712" |
"neo4j://voc#countryName" |
"فيجي" |
true |
"http://www.w3.org/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 |
"http://www.w3.org/1999/02/22-rdf-syntax-ns#langString" |
"en" |
"genid-de0f637b17754c479bbee6732f96f4b1-b0" |
"neo4j://voc#population" |
"867921.0" |
true |
"http://www.w3.org/2001/XMLSchema#decimal" |
null |
"genid-de0f637b17754c479bbee6732f96f4b1-b0" |
"neo4j://voc#onDate" |
"2011-01-01T00:00:00Z" |
true |
"http://www.w3.org/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 |
"http://www.w3.org/2001/XMLSchema#decimal" |
null |
"genid-de0f637b17754c479bbee6732f96f4b1-b1" |
"neo4j://voc#onDate" |
"2012-01-01T00:00:00Z" |
true |
"http://www.w3.org/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 |
"http://www.w3.org/2001/XMLSchema#decimal" |
null |
"genid-de0f637b17754c479bbee6732f96f4b1-b2" |
"neo4j://voc#onDate" |
"2013-01-01T00:00:00Z" |
true |
"http://www.w3.org/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 |
"http://www.w3.org/2001/XMLSchema#decimal" |
null |
"genid-de0f637b17754c479bbee6732f96f4b1-b3" |
"neo4j://voc#onDate" |
"2016-07-01T00:00:00Z" |
true |
"http://www.w3.org/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 |
"http://www.w3.org/2001/XMLSchema#decimal" |
null |
"genid-de0f637b17754c479bbee6732f96f4b1-b4" |
"neo4j://voc#onDate" |
"2017-01-01T00:00:00Z" |
true |
"http://www.w3.org/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 |
"http://www.w3.org/1999/02/22-rdf-syntax-ns#langString" |
"en" |
当我们想要在 Neo4j 中预览 RDF 源返回的三元组时,fetch
方法很有用,在本例中是我们在 Wikidata 上的 SPARQL 查询,但如果我们想要用 Cypher 处理它们,而不是将导入委托给 neosemsntics,则它也很有用。
我们也可以在 Neo4j 浏览器 中使用 n10s.rdf.preview.fetch
过程来预览数据作为图表。
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
部分中定义的关系相互连接。
您可以阅读更多关于访问 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
过程,现在应该可以看到,那个不幸命名的关系现在更易读了。
处理多个值
如果我们看一下查询返回的节点属性,当前所有内容都存储为数组。这是因为 handleMultival
选项设置为 ARRAY
。
如果我们看一下国家节点的属性,就会发现 countryName
存储为字符串数组。这很好,因为我们想要保留国家的国际名称。
{
"uri": "http://www.wikidata.org/entity/Q16",
"countryName": [
"Canada@en",
"加拿大@zh"
]
}
但是,对于大陆节点,onDate
和 population
属性只会有一个值。
{
"onDate": [
"2016-01-01T00:00:00Z"
],
"uri": "genid-0db1342360a44f0f987e27cecb9d4b0a-b8",
"population": [
36155487.0
]
}
将每个值存储在数组中会使查询变得复杂。相反,我们可以通过向 multivalPropList
提供属性键数组来明确指定哪些属性应该存储为数组。设置此选项后,任何未明确列出的属性都将被视为我们已将 handleMultival
设置为 OVERWRITE
,并将属性设置为最终值。
要更新图配置,可以运行 n10s.graphconfig.set
,提供一个包含更新的配置选项的映射。此过程将使用提供的 value 覆盖当前配置,并返回所有配置选项的流。
CALL n10s.graphconfig.set({
multivalPropList: ["neo4j://voc#countryName", "neo4j://voc#continentName"]
})
重新运行预览现在应该会显示 population
和 onDate
属性现在被视为单个值。
{
"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 个三元组。
terminationStatus | triplesLoaded | triplesParsed | namespaces | extraInfo |
---|---|---|---|---|
"OK" |
32210 |
32210 |
null |
"" |
处理多语言属性
我们提供的配置确保每个 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 创建映射
使用 模式理解 和 n10s.rdf.getLangTag
和 n10s.rdf.getLangValue
函数的组合,您可以提取一组 [language, value]
对。这可以传递给 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 辅助函数从数组中提取特定语言数据。
如果您在本教程中遇到了任何问题,可以在 故障排除 页面上找到解决方案。
术语表
- Neo4j 浏览器
-
Neo4j 浏览器 是一个用于查询、可视化和数据交互的用户界面。如果您的数据库正在运行,通常可以通过 HTTP 在端口
:7474
或通过 HTTPS 在端口:7473
上访问它,例如:http://localhost:7474。 - APOC
-
APOC 是一个包含过程和函数的库,可以简化您作为 Neo4j 用户的生活。