没有LIMIT子句,SPARQL查询不起作用

时间:2017-10-19 00:13:34

标签: sparql dbpedia federated-queries

当我在nobel prize database 中执行此句子时,我在避免使用LIMIT子句时遇到错误。

下一个查询有效,因为它有LIMIT子句:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX nobel: <http://data.nobelprize.org/terms/>
PREFIX cat: <http://data.nobelprize.org/resource/category/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>

SELECT DISTINCT ?parentName ?childName 
WHERE {
  ?child owl:sameAs ?personChild ;
      foaf:name ?childName .

  SERVICE <http://dbpedia.org/sparql> {
    { ?personParent dbp:children ?personChild .  }
    UNION
    { ?personChild dbp:parents ?personParent . }
  }

  ?parent owl:sameAs ?personParent ;
      foaf:name ?parentName .
} LIMIT 2

这很奇怪,因为当我删除LIMIT子句时,相同的查询不起作用而不是结果我得到了下一条错误消息:

错误500:发出查询时出现HTTP 400错误:错误请求

这种行为的原因是什么?我做错了吗?

感谢。

1 个答案:

答案 0 :(得分:2)

我已将Fuseki 1中的一小部分三重装入我的Fuseki 2并分析了网络日志。

执行您的查询,Fuseki(或更确切地说是ARQ)向DBpedia发送了许多此类查询(实际上,扩展了前缀):

SELECT  *
WHERE
  {   { ?personParent dbp:children  viaf:58991016 }
    UNION
      { viaf:58991016 dbp:parents  ?personParent }
  }

突然,Fuseki发送了这个查询:

SELECT  *
WHERE
  {   { ?personParent  dbp:children  <Barack Obama> }
    UNION
      { <Barack Obama>  dbp:parents  ?personParent }
  }

上述查询中的这个奇怪的URI无效。您可以自己查看,点击&#34; Barack Obama&#34;在this page

Virtuoso返回错误,Fuseki停止执行。

如果没有省略LIMIT子句,那么,运气好的话,Fuseki会在发送错误的上述查询之前从DBpedia中检索足够数量的结果(并在没有错误的情况下停止执行)。

我建议在查询中添加一些过滤条件:

PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>

SELECT DISTINCT ?parentName ?childName 
WHERE {
  ?child owl:sameAs ?personChild ;
      foaf:name ?childName .
  FILTER (afn:namespace(?personChild) = str(dbpedia:))

  SERVICE <http://dbpedia.org/sparql> {
    { ?personParent dbpprop:children ?personChild .  }
    UNION
    { ?personChild dbpprop:parents ?personParent . }
    FILTER (isIRI(?personParent))
  }

  ?parent owl:sameAs ?personParent ;
      foaf:name ?parentName .
}

Run it!

结果应为:

+-------------------------------+----------------------+
|          parentName           |      childName       |
+-------------------------------+----------------------+
| "Marie Curie, née Sklodowska" | "Irène Joliot-Curie" |
| "Pierre Curie"                | "Irène Joliot-Curie" |
| "Karl Manne Georg Siegbahn"   | "Kai M. Siegbahn"    |
+-------------------------------+----------------------+

在上面的查询中:

    Fuseki 1的
  • PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> - afn:前缀declaration;

  • FILTER (afn:namespace(?personChild) = str(dbpedia:)) - 过滤掉不正确的URI(以及非DBpedia URI,减少了查询次数);

  • FILTER (isIRI(?personParent)) - 过滤掉属性的偶然文字值,略微减少DBpedia的响应大小。

现在我明白了,为什么你不直接使用有关诺贝尔奖的DBpedia数据。 DBpedia数据质量的Scylla和Virtuoso 7的Charybdis之间的最短路径似乎如下:

SELECT DISTINCT ?dbpediaChild ?dbpediaParent {
    VALUES (?award2) { (dbr:Nobel_Prize_in_Chemistry)
                       (dbr:Nobel_Prize_in_Physics)
                       (dbr:Nobel_Peace_Prize)
                       (dbr:Nobel_Prize_in_Physiology_or_Medicine)
                       (dbr:Nobel_Prize_in_Literature) }
    VALUES (?award1) { (dbr:Nobel_Prize_in_Chemistry)
                       (dbr:Nobel_Prize_in_Physics)
                       (dbr:Nobel_Peace_Prize)
                       (dbr:Nobel_Prize_in_Physiology_or_Medicine)
                       (dbr:Nobel_Prize_in_Literature) }
    ?award1 a dbo:Award .
    ?award2 a dbo:Award .
    ?dbpediaChild  dbo:award/(dbo:wikiPageRedirects*)  ?award1 .
    ?dbpediaParent dbo:award/(dbo:wikiPageRedirects*)  ?award2 .
    ?dbpediaChild dbp:parents|^dbp:children ?dbpediaParent .
}

Run it!

但是,结果只会是:

+-------------------------+--------------------+
|      dbpediaChild       |   dbpediaParent    |
+-------------------------+--------------------+
| dbr:Kai_Siegbahn        | dbr:Manne_Siegbahn |
| dbr:Irène_Joliot-Curie  | dbr:Marie_Curie    |
+-------------------------+--------------------+