-1

我有两个问题:

问题 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 结果

伟大的。现在我尝试删除重复项(例如 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

有了这些结果: 新的 SPARQL 结果

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

问题 2

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

此代码没有显示国籍和 knownFor 字段:

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 结果 3

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

4

1 回答 1

1

第一期

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

您的查询(除了 spurious SAMPLE())之间唯一真正的区别是您没有选择同一组变量,因此DISTINCT操作员可能会丢弃一组不同的行。

话虽这么说,SPARQL 引擎不需要以一致的顺序返回结果,因此当您使用时LIMIT,绝对没有要求/保证引擎每次都能为您提供相同的结果。如果您想强制 SPARQL 引擎对结果进行排序,您可以添加一个ORDER BY子句,这应该确保您每次使用时都获得相同的结果,LIMIT但这会使您的查询变慢。

第 2 期

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

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

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

于 2013-07-16T00:08:22.137 回答