1

我正在尝试识别具有完全相同“集合”三元组的主题。在此示例中,数据: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))
}
4

1 回答 1

3

在 Apache Jena Fuseki 和 Ontotext GraphDB 中测试:

SELECT DISTINCT ?s1 ?s2 {
  ?s1 ?p ?o .
  ?s2 ?p ?o .
  FILTER NOT EXISTS { ?s1 ?p1 ?o1 . FILTER NOT EXISTS { ?s2 ?p1 ?o1 } }
  FILTER NOT EXISTS { ?s2 ?p2 ?o2 . FILTER NOT EXISTS { ?s1 ?p2 ?o2 } }
  FILTER (STR(?s1) < STR(?s2))
}

解释

S1S2是分别具有:s1:s2作为主题的三元组的集合。
是什么S1 ≡ S2意思?这意味着S1 ⊆ S2S2 ⊆ S1
是什么S1 ⊆ S2意思?这意味着∀x(x ∈ S1 → x ∈ S2). 不幸的是,在 SPARQL
中没有类似 ('for all') 的东西。 但是,可以改为编写并使用 SPARQL 的. 最后,可以翻译为。
¬∃x¬(x ∈ S1 → x ∈ S2)NOT EXISTS
x ∈ S1:s1 ?p ?o

另请参阅此答案

于 2020-10-08T21:30:51.687 回答