Allegrograph 4.13 を使用して奇妙な動作に直面しています
これはテストケースのデータです
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 を考えると、まったく同じプロパティを持つリソースを見つける必要があります。つまり、:C には 1 つのプロパティ (キー "2" と値 "BB") があるため、:C ではなく :B を見つけたいと考えています。
この質問も参照してください他の関係に基づいてSPARQLで個体を見つける/セットを比較する
Joshua Taylorが親切に提供してくれた次のクエリは、リソースを直接 (: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"
-------------------
2 つ目は変数 ?a を使用しています。これは、いくつかの基準に従って :A を最初に見つける必要があるためです (この例では rdfs:label )。
変数 ?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 ] .
}
}
}
}
戻り値
-------------------
|other| k | v
|A | "1" | "AA"
|B | "1" | "AA"
|C | "1" | "AA"
-------------------
このクエリは :C も返しますが、これは私の意見では間違っています。
この動作を説明したり、このテスト ケースを他のトリプル ストア/SPARQL エンジンで検証したりできる人はいますか?
追加のテスト
コメントのリクエストに従って、rdfs のプレフィックスを追加し、空白のノードを変数に置き換えました。これは効果がないようです。
prefix : <http://example.com/example#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?a ?pr1 ?pr2 ?other ?k ?v {
?a rdfs:label "A" .
# bind (:A as ?a) .
?a :hasProp ?pr1 .
?pr1 :Key ?k ; :Value ?v .
?other :hasProp ?pr2 .
?pr2 :Key ?k ; :Value ?v .
filter not exists {
{ ?a :hasProp ?pp1 .
?pp1 :Key ?kk ; :Value ?vv .
filter not exists { ?other :hasProp ?pp2 .
?pp2 :Key ?kk ; :Value ?vv .
}
}
union
{
?other :hasProp ?pp3 .
?pp3 :Key ?kk ; :Value ?vv .
filter not exists { ?a :hasProp ?pp4 .
?pp4 :Key ?kk ; :Value ?vv .
}
}
}
}
a pr1 pr2 other k v
A Prop1 Prop1 A "1" "AA"
A Prop1 Prop2 B "1" "AA"
A Prop1 Prop3 C "1" "AA"
rdfs:label の行の代わりに BIND (コメント付き) を使用すると、同じように見えます。