我再次遇到了 SPARQL 的问题。首先,一些背景信息:我一直在使用Wikidata 查询服务从 Wikidata 中检索数据。由于 Wikidata SPARQL 端点是有限的并且大型任务会发生超时,我想我会:
- 将查询拆分为几个较小的查询
- 将它们下载为 .csv
- 将它们转换为 .nt N-Triples
- 将它们导入 Cliopatra(使用 SWI-Prolog)
- 使用内置的 YASGUI SPARQL 编辑器在本地查询数据
截至目前,该查询在 Wikidata 查询服务中有效。但是,在本地我没有使 OPTIONAL 功能起作用。
我的 Wikidata 代码如下(这是我要检索的所有数据的一小部分):
SELECT ?q ?GTAA_ID ?pseudonym ?date_of_death
(group_concat(DISTINCT ?occupationLabel;separator=", ") as ?Occupations )
WHERE{
?q wdt:P1741 ?GTAA_ID.
OPTIONAL {?q wdt:P742 ?pseudonym.}
OPTIONAL {?q wdt:P570 ?date_of_death.}
OPTIONAL {?q wdt:P106 ?occupation.}
SERVICE wikibase:label { bd:serviceParam wikibase:language "nl".
?occupation rdfs:label ?occupationLabel.}
}
GROUP BY ?q ?GTAA_ID ?pseudonym ?date_of_death
这正确检索:
q | GTAA_ID | pseudonym | date_of_death | occupation
Q3295087 | 102376 | | 2000-11-05 | acteur
Q2800419 | 89301 | | | politicus, staatsman
and so on
这里的重点是它允许我选择所有具有 Wikidata ID 和 GTAA ID 以及相应的假名、date_of_death 和职业(如果有)的结果。此外,如果一个人有多个职业,它会用“,”分隔它们并将它们放在同一行中。
但是,如上所述,我下载了文件以便能够在本地查询它们。为此,我使用以下格式将 .csv 文件转换为 .nt:
<?s> <?p> "?o"
其中对象是一个字符串。请注意,在以下示例中,?p 以我转换为 .nt 的方式正确使用。(因此使用了 PREFIX ps)将它们加载到 Cliopatria 并在 YASGUI 编辑器中使用以下代码:
PREFIX ps: <http://www.wikidata.org/prop/statement/>
SELECT ?q ?GTAA_ID ?date_of_death ?pseudonym
(group_concat(DISTINCT ?occupation;separator=", ") as ?occupations )
WHERE{
?q ps:P1741 ?GTAA_ID.
OPTIONAL{?q ps:P742 ?pseudonym.}
OPTIONAL{?q ps:P106 ?occupation.}
OPTIONAL{?q ps:P570 ?date_of_death.}
}
GROUP BY ?q ?GTAA_ID ?date_of_death ?pseudonym
但是,在此查询中,?pseudonym ?occupation 和 ?date_of_death 是可选的,但这些职业没有连接成一行。 查询 1
如果我将 GROUP BY 函数替换为
GROUP BY ?q ?GTAA_ID
它根本不显示 ?pseudonym 和 ?date_of_death,但会连接 ?occupation。 查询 2
如果我将 GROUP BY 函数替换为
GROUP BY ?q ?GTAA_ID ?date_of_death
它仅连接具有 ?date_of_death 的 ?q 的 ?occupation。没有 ?date_of_death 的那些不会连接到 1 行。此外,它根本不显示任何假名。 查询 3
我怀疑这与 GROUP BY 函数与 group_concat 函数的结合有关。但是,我不明白为什么它可以在 Wikidata 查询服务中工作,但不能在我的本地主机上工作。本地使用的.nt文件可以在这里访问
提前谢谢了!