Rdf 如何使用SPARQL 1.1';s的价值观?

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>

使用SPARQL 1.1,下面的查询返回主题为EinsteinKnuth的所有谓词(以及它们的标签)

前缀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
}