我正在尝试识别具有完全相同“集合”三元组的主题。在此示例中,数据: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 .
我在 StackOverflow 上找到了示例 SPARQL,它可以识别:Set1
在其他集合之间匹配的单个三元组,甚至是匹配的数量,但不是如何识别整个三元组的精确匹配。我期望FILTER NOT EXISTS
和的组合!SAMETERM
是必需的,但我无法使语法正确。
更新:我改编了来自@StanislavKralin 的 SPARQL,以找到与 :Set1 相同的其他集合。它几乎可以工作。
SELECT DISTINCT ?s2 {
:Set1 ?p ?o .
?s2 ?p ?o .
FILTER NOT EXISTS { :Set1 ?p1 ?o1 . FILTER NOT EXISTS { ?s2 ?p1 ?o1 } }
FILTER NOT EXISTS { ?s2 ?p2 ?o2 . FILTER NOT EXISTS { :Set1 ?p2 ?o2 } } # omits match from :Set3 to :Set1
FILTER (STR(:Set1) < STR(?s2))
}
但是,我的查询结果包括:Set4,这是不正确的。
:Set2
:Set4
我错过了什么?
[更新] 如以下评论所述,Stanislav 在 Stardog 社区论坛上提供了进一步的解释和代码:https ://community.stardog.com/t/unexpected-sparql-filter-results/2745/14 ,以及其他信息来自 Pavel Klinov 解释 Stardog 目前的行为。如您所见,已打开一张票以供解决。同时,斯坦尼斯拉夫提供的这段代码提供了正确的结果:
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))
}