SPARQL:找到具有相同三元组的主题?

SPARQL:找到具有相同三元组的主题?,sparql,rdf,stardog,Sparql,Rdf,Stardog,我试图识别具有完全相同的三元组的主体。在此示例数据中,:Set2应被标识为与:Set1唯一精确匹配,而:Set1和:Set3由于值:VAL_E而不是精确匹配 @prefix : <https://www.example.org/Eg#>. :Set1 :hasValue :VAL_A, :VAL_B, :VAL_C, :VAL_D . :Set2 :hasValue :VAL_A, :VAL_B, :VAL_C, :VAL_D . :Set3 :hasValue :VAL_

我试图识别具有完全相同的三元组的主体。在此示例数据中,
:Set2
应被标识为与
:Set1
唯一精确匹配,而
:Set1
:Set3
由于值
:VAL_E
而不是精确匹配

@prefix :  <https://www.example.org/Eg#>.

:Set1 :hasValue  :VAL_A, :VAL_B, :VAL_C, :VAL_D .
:Set2 :hasValue  :VAL_A, :VAL_B, :VAL_C, :VAL_D .
:Set3 :hasValue  :VAL_A, :VAL_B, :VAL_C, :VAL_D, :VAL_E .
:Set4 :hasValue  :VAL_A, :VAL_B .
:Set5 :hasValue  :VAL_F, :VAL_G, :VAL_H, :VAL_I, :VAL_J .
但是,我的查询结果包括:Set4,这是不正确的

:Set2
:Set4
我错过了什么

[更新] 如以下评论所述,Stanislav在Stardog社区论坛上提供了进一步的解释和代码:,以及Pavel Klinov提供的解释Stardog当前行为的其他信息。正如你在那里看到的,一张票已经打开,等待解决。同时,Stanislav提供的代码提供了正确的结果:

SELECT DISTINCT ?s1 ?s2 {
  ?s1 ?p ?o .   
  ?s2 ?p ?o .
  FILTER NOT EXISTS {
    ?s1 ?p ?o . 
    ?s2 ?p ?o . 
    ?s1 ?p1 ?o1 . 
    FILTER NOT EXISTS { ?s2 ?p1 ?o1 } }
  FILTER NOT EXISTS {
    ?s1 ?p ?o . 
    ?s2 ?p ?o .
    ?s2 ?p2 ?o2 . 
    FILTER NOT EXISTS { ?s1 ?p2 ?o2 } }
  FILTER (STR(?s1) < STR(?s2))
}
选择不同的s1-s2{
?s1?p?o。
?s2?p?o。
筛选器不存在{
?s1?p?o。
?s2?p?o。
?s1?p1?o1。
筛选器不存在{s2?p1?o1}
筛选器不存在{
?s1?p?o。
?s2?p?o。
?s2?p2?o2。
筛选器不存在{s1?p2?o2}
滤波器(STR(?s1)
在Apache Jena Fuseki和Ontotext GraphDB中测试:

选择不同的s1-s2{
?s1?p?o。
?s2?p?o。
筛选器不存在{s1?p1?o1。筛选器不存在{s2?p1?o1}
筛选器不存在{s2?p2?o2。筛选器不存在{s1?p2?o2}
滤波器(STR(?s1)
解释

S1
S2
为分别以
:S1
:S2
为主题的三元组。
什么是
S1≡ S2
平均值?这意味着
S1⊆ S2
S2⊆ S1

什么是
S1⊆ S2
平均值?这意味着
∀x(x∈ S1→ x∈ S2)

不幸的是,没有类似于
∀('for all')。
然而,人们可以编写
∃x(x)∈ S1→ x∈ S2)
而使用SPARQL的
不存在

最后,
x∈ S1
可以翻译为
:S1?p?o


另请参见在Apache Jena Fuseki和Ontotext GraphDB中测试的。

选择不同的s1-s2{
?s1?p?o。
?s2?p?o。
筛选器不存在{s1?p1?o1。筛选器不存在{s2?p1?o1}
筛选器不存在{s2?p2?o2。筛选器不存在{s1?p2?o2}
滤波器(STR(?s1)
解释

S1
S2
为分别以
:S1
:S2
为主题的三元组。
什么是
S1≡ S2
平均值?这意味着
S1⊆ S2
S2⊆ S1

什么是
S1⊆ S2
平均值?这意味着
∀x(x∈ S1→ x∈ S2)

不幸的是,没有类似于
∀('for all')。
然而,人们可以编写
∃x(x)∈ S1→ x∈ S2)
而使用SPARQL的
不存在

最后,
x∈ S1
可以翻译为
:S1?p?o


另请参见。

您的查询结果是什么样的?请参阅我上面编辑的问题,以获取尝试的自适应。@Tim,我的查询返回
({?s1→:Set1,?s2→:Set2})
。您的查询返回
({?s2→:Set2})
对我来说,而不是
({?s2→:Set2},{?s2→:Set4})
。你用的是哪种三联钻?我用的是星狗7。我会将此示例数据发布到他们的支持论坛,并在收到反馈后在此更新。谢谢你提供的信息!好啊我希望这是一个查询优化问题。然而,这个问题本身是微妙的,例如,感谢您在这里和Stardog论坛上的详细解释。我用您提供的示例代码更新了我的问题,以便人们可以直接在so上看到。您的查询结果是什么样的?请参阅我上面编辑的问题,以获取尝试的自适应。@Tim,我的查询返回
({?s1→:Set1,?s2→:Set2})
。您的查询返回
({?s2→:Set2})
对我来说,而不是
({?s2→:Set2},{?s2→:Set4})
。你用的是哪种三联钻?我用的是星狗7。我会将此示例数据发布到他们的支持论坛,并在收到反馈后在此更新。谢谢你提供的信息!好啊我希望这是一个查询优化问题。然而,这个问题本身是微妙的,例如,感谢您在这里和Stardog论坛上的详细解释。我用您提供的示例代码更新了我的问题,以便人们可以直接在so上看到它。
SELECT DISTINCT ?s1 ?s2 {
  ?s1 ?p ?o .   
  ?s2 ?p ?o .
  FILTER NOT EXISTS {
    ?s1 ?p ?o . 
    ?s2 ?p ?o . 
    ?s1 ?p1 ?o1 . 
    FILTER NOT EXISTS { ?s2 ?p1 ?o1 } }
  FILTER NOT EXISTS {
    ?s1 ?p ?o . 
    ?s2 ?p ?o .
    ?s2 ?p2 ?o2 . 
    FILTER NOT EXISTS { ?s1 ?p2 ?o2 } }
  FILTER (STR(?s1) < STR(?s2))
}