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

太好了。现在我试着去掉重复的(比如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使这些模式成为强制性的将告诉您是这种情况,还是条目没有这些属性。

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

最新更新