2017-10-19 73 views
2

当我在nobel prize database执行这句话时我得到了错误,当我避免使用LIMIT子句时。SPARQL查询没有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错误进行查询:坏请求

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

谢谢。

+2

这是不是相同的查询只是没有'LIMIT'?三重商店是'Fuseki - 版本1.1.0'也许它失败了,因为没有'LIMIT'因为联合查询太昂贵,也许导致超时。实际上,根据实现的不同,在“SERVICE”子句中调用的远程服务也可能存在问题。 – AKSW

+1

我建议设置您自己的三重商店并在本地加载数据。然后你可以得到更好的错误日志并完全控制。至少加载诺贝尔奖的RDF转储不应该那么耗时。 – AKSW

+1

@AKSW谢谢我要试试这个。 – winter

回答

2

我已经从Fuseki 1中加载了一小部分三元组到我的Fuseki 2并分析了网络日志。

执行查询,定式(或相当ARQ)发送到DBpedia的这种(实际上,前缀扩展)的许多疑问:

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

突然,定式发送此查询:

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

上述查询中的这个奇怪的URI无效。你可以自己查看,点击“Barack Obama”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" | 
+-------------------------------+----------------------+ 

在上面的查询:

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

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

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


现在我明白了,你为什么不直接使用有关诺贝尔奖DBpedia的数据。炫技7条虫子似乎的DBpedia的数据质量斯库拉和卡律布狄斯之间的最短路径,如下所示:

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 | 
+-------------------------+--------------------+ 
+0

感谢您的建议,我打算应用它! – winter

+0

我有一个关于你的第一个查询的问题,在你的第一个命题中添加'dbpediaChild(dbpprop:parents |^dbpprop:children)?dbpediaParent .'而不是'UNION'子句,但是现在,你提议使用'UNION'再说一次,这是否存在? – winter

+1

@ winter,不,没关系。 –