Rdf 如何使用SPARQL 1.1';s的价值观?
使用SPARQL 1.1,下面的查询返回主题为Einstein或Knuth的所有谓词(以及它们的标签)Rdf 如何使用SPARQL 1.1';s的价值观?,rdf,sparql,semantic-web,dbpedia,linked-data,Rdf,Sparql,Semantic Web,Dbpedia,Linked Data,使用SPARQL 1.1,下面的查询返回主题为Einstein或Knuth的所有谓词(以及它们的标签) 前缀dbp: 选择不同的子输出标签 { 值?sub{dbp:Albert_Einstein dbp:Donald_Knuth} ?子输出[]。 ?输出?标签。 } 是否可以使用此值功能公开谓词的交集而不是并集?或者我误解了的价值观是什么 编辑:澄清 对于一个简化的示例,假设有以下三元组: <Einstein> <influenced> <John>
前缀dbp:
选择不同的子输出标签
{
值?sub{dbp:Albert_Einstein dbp:Donald_Knuth}
?子输出[]。
?输出?标签。
}
是否可以使用此值功能公开谓词的交集而不是并集?或者我误解了的价值观是什么
编辑:澄清
对于一个简化的示例,假设有以下三元组:
<Einstein> <influenced> <John>
<Einstein> <influenced> <Knuth>
<Einstein> <born> <Mars>
<Einstein> <died> <Los Angeles>
<Knuth> <influenced> <Kirby>
<Knuth> <born> <Mars>
<Knuth> <wrote> <TAOCP>
<Knuth> <drove> <Truck>
我得到的“union”都是附加到任一主题的唯一谓词(为了清晰起见,请将行分隔开):
| sub | pred|
-------------------------
我所追求的“交集”是两个主题共有的唯一谓词:
| ?sub | ?pred |
-------------------------
<Einstein> <influenced>
<Knuth> <influenced>
<Einstein> <born>
<Knuth> <born>
| sub | pred|
-------------------------
解决方案
您可以使用这样的查询。诀窍是按谓词分组,只取那些正好有两个主语的谓词(爱因斯坦和克努特)
这样,为了使计数(distinct?sub)为2,您必须将?sub?output[]
与?sub=Einstein
和?sub=Knuth
匹配
检查方法
我们可以使用DBpedia端点来处理这些问题。首先,简化查询:
select distinct ?s ?p where {
values ?s { dbpedia:Albert_Einstein dbpedia:Donald_Knuth }
?s ?p []
}
现在,当我们还在选择?s时,请求一个交点是没有意义的,因为爱因斯坦≠ 克努斯,所以从来没有交叉点。但是我们可以在?p上走一个十字路口。下面是一个查询,该查询获取两个属性都有值的所有属性:
select distinct ?p where {
dbpedia:Albert_Einstein ?p [] .
dbpedia:Donald_Knuth ?p []
}
类似的查询为我们统计结果:
select (count(distinct ?p) as ?np) where {
dbpedia:Albert_Einstein ?p [] .
dbpedia:Donald_Knuth ?p [] .
}
它们都有45个属性
分组依据查询为
select distinct ?p where {
values ?s { dbpedia:Albert_Einstein dbpedia:Donald_Knuth }
?s ?p []
}
group by ?p
having count(?s) = 2
现在,让我们确保另一种方法得到相同的结果:
select (count(*) as ?np) where {
select distinct ?p where {
values ?s { dbpedia:Albert_Einstein dbpedia:Donald_Knuth }
?s ?p []
}
group by ?p
having count(distinct ?s) >= 2
}
这也返回45,因此我们看到得到了相同的结果。如果是交叉点,查询中的
?sub
的值到底是多少?爱因斯坦还是克努斯?当你说交集时,你的意思是克努斯和爱因斯坦对于一个属性有相同的值,还是两者对于一个属性都有一个值?爱因斯坦或克努斯可以在>子中。所谓交集,我指的是谓词的交集,对值没有限制。好的,那么我想我的答案应该适合你。你有机会试试吗?还没有,它在待办事项清单上。看起来你花了很多时间,所以我想非常仔细地讨论一下。感谢你使用各种sparql特性丰富了很多选项。
select distinct ?outpred ?label
{
values ?sub { dbp:Albert_Einstein dbp:Donald_Knuth }
?sub ?outpred [] .
?outpred <http://www.w3.org/2000/01/rdf-schema#label> ?label .
}
group by ?outpre ?label
having count(distinct ?sub) = 2
select distinct ?s ?p where {
values ?s { dbpedia:Albert_Einstein dbpedia:Donald_Knuth }
?s ?p []
}
s p
http://dbpedia.org/resource/Albert_Einstein http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://dbpedia.org/resource/Donald_Knuth http://www.w3.org/1999/02/22-rdf-syntax-ns#type
http://dbpedia.org/resource/Albert_Einstein http://www.w3.org/2002/07/owl#sameAs
http://dbpedia.org/resource/Donald_Knuth http://www.w3.org/2002/07/owl#sameAs
⋮ ⋮
select distinct ?p where {
dbpedia:Albert_Einstein ?p [] .
dbpedia:Donald_Knuth ?p []
}
select (count(distinct ?p) as ?np) where {
dbpedia:Albert_Einstein ?p [] .
dbpedia:Donald_Knuth ?p [] .
}
select distinct ?p where {
values ?s { dbpedia:Albert_Einstein dbpedia:Donald_Knuth }
?s ?p []
}
group by ?p
having count(?s) = 2
select (count(*) as ?np) where {
select distinct ?p where {
values ?s { dbpedia:Albert_Einstein dbpedia:Donald_Knuth }
?s ?p []
}
group by ?p
having count(distinct ?s) >= 2
}