3

我再次遇到了 SPARQL 的问题。首先,一些背景信息:我一直在使用Wikidata 查询服务从 Wikidata 中检索数据。由于 Wikidata SPARQL 端点是有限的并且大型任务会发生超时,我想我会:

  1. 将查询拆分为几个较小的查询
  2. 将它们下载为 .csv
  3. 将它们转换为 .nt N-Triples
  4. 将它们导入 Cliopatra(使用 SWI-Prolog)
  5. 使用内置的 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文件可以在这里访问

提前谢谢了!

4

0 回答 0