对DBPedia查询和不支持的属性的多个响应

时间:2013-07-15 22:29:15

标签: rdf sparql dbpedia

我有两个问题:

问题1

这第一个问题在Stack上有不错的文档,除了没有其他人似乎得到与我相同的结果,所以我认为每个人都可以在这里问它。当我运行以下查询时:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?person ?commonName ?nationality WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
    ?person a dbpedia-owl:Person;
              dbpedia-owl:birthDate ?birthDate 
}
LIMIT 30

我得到这个人名单:

SPARQL RESULTS

大。现在我尝试删除重复项(就像Abbas Suan,他用三种不同的语言出现三次 - 我想保留英语)我这样做:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?person (SAMPLE(?commonName) as ?commonName) ?birthDate WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
    ?person a dbpedia-owl:Person;
              dbpedia-owl:birthDate ?birthDate 
}
LIMIT 30

有了这些结果: NEW SPARQL RESULTS

所以,在我看来,我有两个完全不同的人名单。我怎么知道我不会这样丢人?我试图在维基百科上下载具有某些属性的每个人,这是发布2的一个很好的赛道。

第2期

当我编写上面的代码时,它适用于这两个属性。但是,当我尝试添加国籍和knownFor属性(因此我们知道它们做了什么以及它们来自何处)时,代码就会出错。即使所有这些属性都在DBPedia结构中的Person的同一页面上。

此代码不显示国籍和已知字段:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?person (SAMPLE(?commonName) as ?commonName) ?birthDate ?nationality ?      knownFor WHERE {
    ?person a dbpedia-owl:Person ;  
              dbpedia-owl:commonName ?commonName . FILTER(lang(?commonName) = 'en')
    ?person a dbpedia-owl:Person;
              dbpedia-owl:birthDate ?birthDate .
    OPTIONAL {?person a dbpedia-owl:Person;
              dbpedia-owl:nationality ?nationality .}
    OPTIONAL {?person a dbpedia-owl:Person;
              dbpedia-owl:knownFor ?knownFor .}
}
LIMIT 30

这些结果:

SPARQL RESULTS 3

对任何问题的任何帮助都会非常有帮助!感谢

1 个答案:

答案 0 :(得分:1)

第1期

您的第一个查询使用了查询中不存在的变量?nationality,这是合法的SPARQL,但Virtuoso编译器错误。至于你的第二个查询,它实际上是非法的SPARQL语法 - 你不能为自己分配一个变量。众所周知,Virtuoso对SPARQL规范的某些部分的解释是非标准的,因此我们将忽略它。

您的查询之间唯一真正的区别(虚假SAMPLE()除外)是您没有选择相同的变量集,因此DISTINCT运算符可能会丢弃不同的行集。

据说没有要求SPARQL引擎以一致的顺序返回结果,所以当你使用LIMIT时,绝对没有要求/保证引擎每次都给你相同的结果。如果要强制SPARQL引擎对结果进行排序,则可以添加ORDER BY子句,这样可以确保每次使用LIMIT时获得相同的结果,但这会使查询变慢。

第2期

?person a dbpedia-owl:Person内添加OPTIONAL技术上已不存在,但实际上它可能会提高性能。你确定每个被退回的人都有吗?

完全有可能因为LIMIT Virtuoso支持解决方案而不需要评估OPTIONAL子句,从而节省它的工作量。删除OPTIONAL以强制使用这些模式将告诉您是否是这种情况,或者条目是否没有这些属性。

例如,结果中的这个example没有任何可选属性存在,这表明后者是这种情况。