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))
}