给定对象:A,:B和:C已分配属性,而这些属性本身不是标量,但也是具有键和值属性的对象。
@prefix x: <http://example.com/example#>
x:A x:hasProp x:Prop1 .
x:Prop1 x:Key "1" .
x:Prop1 x:Value "AA" .
x:B x:hasProp x:Prop2 .
x:Prop2 x:Key "1" .
x:Prop2 x:Value "AA" .
x:C x:hasProp x:Prop3 .
x:C x:hasProp x:Prop4 .
x:Prop3 x:Key "1" .
x:Prop3 x:Value "AA" .
x:Prop4 x:Key "2" .
x:Prop4 x:Value "BB" .
我如何断言:A和:B具有相同的属性,而:A和:C不是? 我是SPARQL的新手,我不知道...... 我试过像:
prefix x: <http://example.com/example#>
select ?another ?k ?v
{x:A x:hasProp ?p .
?p ?k ?v .
?another x:hasProp ?p2 .
?p2 ?k ?v .
}
但我认为这是错误的方式。它还返回:C。
如何在SPARQL中轻松比较两组?
其他问题: 答案1中的查询工作正常,但仅限于:A直接使用。使用变量代替:A使:C也符合条件。为什么呢?
我的意思是: 插入一些条件来查找:Aprefix : <http://example.com/example#>
INSERT DATA {:A rdfs:label "A"}
然后使用变量代替:A
prefix : <http://example.com/example#>
select ?other ?k ?v {
#-- Find ?other such that :A and ?other have
#-- some property in common,
?a rdfs:label "A"
?a :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
#-- but remove any ?other such that:
filter not exists {
#-- (i) :A has a property that ?other doesn't;
{
?a :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
#-- or (ii) ?other has a property that :A doesn't.
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists {
?a :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}
更新
prefix : <http://example.com/example#>
INSERT DATA {
:A rdfs:label "A" .
:A :hasProp :Prop1 .
:Prop1 :Key "1" .
:Prop1 :Value "AA" .
:B :hasProp :Prop2 .
:Prop2 :Key "1" .
:Prop2 :Value "AA" .
:C :hasProp :Prop3 .
:C :hasProp :Prop4 .
:Prop3 :Key "1" .
:Prop3 :Value "AA" .
:Prop4 :Key "2" .
:Prop4 :Value "BB" .
}
查询使用:A
prefix : <http://example.com/example#>
select ?other ?k ?v {
:A :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
filter not exists {
{ :A :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { :A :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}
答案:
-------------------
|other| k | v
|A | "1" | "AA"
|B | "1" | "AA"
-------------------
使用变量查询?a:
prefix : <http://example.com/example#>
select ?other ?k ?v {
?a rdfs:label "A" .
?a :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
filter not exists {
{ ?a :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists { ?a :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}
返回
其他k v
A&#34; 1&#34; &#34; AA&#34;
B&#34; 1&#34; &#34; AA&#34;
C&#34; 1&#34; &#34; AA&#34;
答案 0 :(得分:2)
显示您实际获得的输出总是有帮助的,因为这样您就可以指出您不期望的部分。在这种情况下,您的查询将返回:
---------------------------
| another | k | v |
===========================
| :C | :Value | "AA" |
| :C | :Key | "1" |
| :B | :Value | "AA" |
| :B | :Key | "1" |
| :A | :Value | "AA" |
| :A | :Key | "1" |
---------------------------
这在你的情况下是有道理的,因为C确实有你要问的那种数据。这是您的部分数据:
x:A x:hasProp x:Prop1 .
x:Prop1 x:Key "1" .
x:Prop1 x:Value "AA" .
…
x:C x:hasProp x:Prop3 .
…
x:Prop3 x:Key "1" .
x:Prop3 x:Value "AA" .
以下是我如何编写一个能够满足您需求的查询。找到与:A
具有共同属性的东西很容易。在这些内容中,您需要过滤掉任何?other
,以使:A
具有?other
不具有的属性,或?other
具有{{1}的属性没有,
:A
prefix : <http://example.com/example#>
select ?other ?k ?v {
#-- Find ?other such that :A and ?other have
#-- some property in common,
:A :hasProp [ :Key ?k ; :Value ?v ] .
?other :hasProp [ :Key ?k ; :Value ?v ] .
#-- but remove any ?other such that:
filter not exists {
#-- (i) :A has a property that ?other doesn't;
{
:A :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists {
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
#-- or (ii) ?other has a property that :A doesn't.
{
?other :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists {
:A :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}
实际上,您可以使用它的泛化来列出数据中的不同等价类。
----------------------
| other | k | v |
======================
| :B | "1" | "AA" |
| :A | "1" | "AA" |
----------------------
prefix : <http://example.com/example#>
select distinct ?x ?y {
?x :hasProp [] .
?y :hasProp [] .
filter not exists {
{
?x :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists {
?y :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
union
{
?y :hasProp [ :Key ?kk ; :Value ?vv ] .
filter not exists {
?x :hasProp [ :Key ?kk ; :Value ?vv ] .
}
}
}
}
order by ?x ?y