我有两个问题:
第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
当我编写上面的代码时,它对这两个属性都很有效。然而,当我尝试添加国籍和knowFor属性(这样我们就知道它们做了什么以及它们来自哪里)时,代码会出错。即使所有这些属性都在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结果3
对任何问题的任何帮助都将非常有帮助!感谢
第1期
你的第一个查询使用了一个不在查询中的变量?nationality
,这是合法的SPARQL,但Virtuoso编译器在上面出错。至于你的第二个查询,这实际上是非法的SPARQL语法-你不能给它自己分配变量。Virtuoso在解释SPARQL规范的某些部分时是出了名的不标准,所以我们将忽略这一点。
查询(除了伪SAMPLE()
)之间唯一真正的区别是,您没有选择相同的变量集,因此DISTINCT
运算符可能会丢弃不同的行集。
也就是说,没有要求SPARQL引擎以一致的顺序返回结果,因此当您使用LIMIT
时,绝对没有要求/保证引擎每次都能给您相同的结果。如果您想强制SPARQL引擎对结果进行排序,可以添加ORDER BY
子句,这样可以确保每次使用LIMIT
时都能得到相同的结果,但这会使查询速度变慢。
第2期
在OPTIONAL
中添加?person a dbpedia-owl:Person
在技术上是无效的,尽管实际上它可以提高性能。你确定每个被遣返的人都有它吗?
完全有可能的是,由于LIMIT
,Virtuoso倾向于不需要评估OPTIONAL
子句的解决方案,从而节省了它的工作。删除OPTIONAL
使这些模式成为强制性的将告诉您是这种情况,还是条目没有这些属性。
例如,结果中的这个例子既不存在任何可选属性,这表明情况是后者。