我有两个问题:
问题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
我得到这个人名单:
大。现在我尝试删除重复项(就像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
这些结果:
对任何问题的任何帮助都会非常有帮助!感谢
答案 0 :(得分:1)
您的第一个查询使用了查询中不存在的变量?nationality
,这是合法的SPARQL,但Virtuoso编译器错误。至于你的第二个查询,它实际上是非法的SPARQL语法 - 你不能为自己分配一个变量。众所周知,Virtuoso对SPARQL规范的某些部分的解释是非标准的,因此我们将忽略它。
您的查询之间唯一真正的区别(虚假SAMPLE()
除外)是您没有选择相同的变量集,因此DISTINCT
运算符可能会丢弃不同的行集。
据说没有要求SPARQL引擎以一致的顺序返回结果,所以当你使用LIMIT
时,绝对没有要求/保证引擎每次都给你相同的结果。如果要强制SPARQL引擎对结果进行排序,则可以添加ORDER BY
子句,这样可以确保每次使用LIMIT
时获得相同的结果,但这会使查询变慢。
在?person a dbpedia-owl:Person
内添加OPTIONAL
技术上已不存在,但实际上它可能会提高性能。你确定每个被退回的人都有吗?
完全有可能因为LIMIT
Virtuoso支持解决方案而不需要评估OPTIONAL
子句,从而节省它的工作量。删除OPTIONAL
以强制使用这些模式将告诉您是否是这种情况,或者条目是否没有这些属性。
例如,结果中的这个example没有任何可选属性存在,这表明后者是这种情况。