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

Rdf 对DBPedia查询和不支持的属性的多个响应,rdf,sparql,dbpedia,Rdf,Sparql,Dbpedia,我有两个问题: 第1期 第一个问题在这里有很好的文档,除了没有其他人能得到和我一样的结果,所以我想我在这里问一下对每个人都有好处。当我运行以下查询时: PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX type: <http://dbpedia.org/class/yago/> PREFIX prop: <http://dbpedia.org/ontology/> SELE

我有两个问题:

第1期

第一个问题在这里有很好的文档,除了没有其他人能得到和我一样的结果,所以我想我在这里问一下对每个人都有好处。当我运行以下查询时:

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
前缀rdfs:
前缀类型:
前缀道具:
选择不同的?人?通用名?国籍,在哪里{
?个人a数据库猫头鹰:个人;
dbpedia owl:commonName?commonName.FILTER(lang(?commonName)='en')
?个人a数据库猫头鹰:个人;
dbpedia猫头鹰:生日?生日
}
限制30
我得到了以下人员名单:

太好了。现在我试着删去重复的部分(比如阿巴斯·苏安,他用三种不同的语言出现了三次——我想保留英语),我这样做:

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
前缀rdfs:
前缀类型:
前缀道具:
选择不同的人(样本(?commonName)作为commonName)?出生日期,其中{
?个人a数据库猫头鹰:个人;
dbpedia owl:commonName?commonName.FILTER(lang(?commonName)='en')
?个人a数据库猫头鹰:个人;
dbpedia猫头鹰:生日?生日
}
限制30
根据这些结果:

所以,在我看来,我有两张完全不同的名单。我怎么知道我没有这样失去别人?我正试图下载维基百科上每一个人的某些属性,这是第二期的一个好方法

第二期

当我编写上述代码时,它对这两个属性都很有效。然而,当我尝试添加国籍和known属性时(这样我们就知道它们做了什么以及它们来自哪里),代码就会出错。即使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
前缀rdfs:
前缀类型:
前缀道具:
选择不同的人(样本(?commonName)作为commonName)?出生日期?国籍?不知道在哪里{
?个人a数据库猫头鹰:个人;
dbpedia owl:commonName?commonName.FILTER(lang(?commonName)='en')
?个人a数据库猫头鹰:个人;
dbpedia猫头鹰:生日?生日。
可选{?person a dbpedia owl:person;
dbpedia猫头鹰:国籍?国籍。}
可选{?person a dbpedia owl:person;
dbpedia-owl:known?known.}
}
限制30
根据这些结果:

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

第1期 您的第一个查询使用了一个变量
?national
,该变量不在查询中,这是合法的SPARQL,但Virtuoso编译器在其上出错。至于你的第二个查询,它实际上是非法的SPARQL语法——你不能给它自己分配一个变量。Virtuoso在解释SPARQL规范的某些部分时是出了名的非标准,所以我们将忽略这一点

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

也就是说,SPARQL引擎不要求以一致的顺序返回结果,因此当您使用
LIMIT
时,绝对不要求/保证引擎每次都提供相同的结果。如果要强制SPARQL引擎对结果进行排序,可以添加一个
ORDER BY
子句,这样可以确保每次使用
LIMIT
时得到相同的结果,但这会使查询速度变慢

问题2 添加
?person a dbpedia owl:person
可选
中在技术上是无效的,尽管实际上它可以提高性能。你确定每个被送回的人都有吗

由于
限制
,Virtuoso完全有可能倾向于不需要评估
可选
子句的解决方案,从而使其不起作用。删除
可选项
使这些模式成为强制模式将告诉您是这种情况还是条目没有这些属性


例如,结果中的这两个选项都不存在,这表明后者是正确的。

请不要将多个问题作为一个问题发布,以后请将每个问题作为单独的问题发布。此外,您的几个结果链接已断开。此外,您还没有包含所有前缀声明,因此无法将这些查询剪切并粘贴到任意SPARQL工具中。第一个查询出现错误:
Virtuoso 37000错误SP030:SPARQL编译器,第1行:前缀声明中缺少“我已包含我使用的所有前缀,它们是否适合使用。我一直在使用的代码是非常随意的,有一半的时间是由于Virtuoso编译器崩溃并说“这个网站正在维护”。忽略国籍(这只是我这边的一个输入错误),这就是我得到的结果。很抱歉,它们好像坏了,它们和编辑者一起为我工作。但是,名称仍然不同,我不知道为什么,当我取出可选命令时,对于第二个问题,没有一个字段是填充的,甚至连生日和commonName都没有。这是否意味着这两个道具不存在?