【发布时间】:2020-10-08 20:38:46
【问题描述】:
我正在尝试识别具有完全相同“集合”三元组的主题。在此示例数据中,: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 和其他集合之间匹配的单个三元组,甚至是 number of matches,但不知道如何识别整个三元组的精确匹配。我预计需要 FILTER NOT EXISTS 和 !SAMETERM 的组合,但我无法正确获取语法。
更新: 我改编了来自@StanislavKralin 的 SPARQL,以找到与 :Set1 相同的其他 Set。它几乎可以工作。
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
我错过了什么?
[更新] 正如下面的 cmets 所述,Stanislav 在 Stardog 社区论坛上提供了进一步的解释和代码:https://community.stardog.com/t/unexpected-sparql-filter-results/2745/14,以及来自 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))
}
【问题讨论】: