如何使用 SPARQL 查找两个属性不共享任何相同对象的实例?
How can I use SPARQL to find instances where two properties do not share any of the same objects?
在我公司的分类法中,所有概念都具有 skos:prefLabel 的值,并且大多数概念都具有自定义 属性 的一堆值——我们称它为ex:keyword -- 其值的数据类型为 rdf:langString。当忽略大小写和语言时,我想找到 skos:prefLabel 的值与 ex:keyword 的任何值不完全匹配的概念。
为值匹配的概念编写查询非常简单,如下所示:
SELECT *
WHERE {
?concept skos:prefLabel ?label ;
ex:keyword ?kw
FILTER (lcase(str(?label)) = lcase(str(?kw)))
}
我被绊倒的地方是试图否定这一点。
在 FILTER 中使用 !=
只会 return 一堆情况 ?label 和 ?kw 不匹配,这不是我想要的。
我想要的是能够使用 FILTER NOT EXISTS,但这对于像 (?a = ?b)
这样的表达式是无效的;它只适用于 {?a ?b ?c}
.
我怀疑在 SPARQL 中有一种表达 FILTER NOT EXISTS (?a = ?b)
的正确方法,但我不知道它是什么。有人可以帮忙吗?
诀窍是将用于匹配关键字的三重模式放在 FILTER NOT EXISTS
中,如下所示:
SELECT *
WHERE {
?concept skos:prefLabel ?label .
FILTER NOT EXISTS { ?concept ex:keyword ?kw .
FILTER(lcase(str(?label)) = lcase(str(?kw)))
}
}
此查询表示“我想要所有带有 preflabel 的概念,以便该概念没有匹配该 prefLabel 的关键字值”。
在我公司的分类法中,所有概念都具有 skos:prefLabel 的值,并且大多数概念都具有自定义 属性 的一堆值——我们称它为ex:keyword -- 其值的数据类型为 rdf:langString。当忽略大小写和语言时,我想找到 skos:prefLabel 的值与 ex:keyword 的任何值不完全匹配的概念。
为值匹配的概念编写查询非常简单,如下所示:
SELECT *
WHERE {
?concept skos:prefLabel ?label ;
ex:keyword ?kw
FILTER (lcase(str(?label)) = lcase(str(?kw)))
}
我被绊倒的地方是试图否定这一点。
在 FILTER 中使用 !=
只会 return 一堆情况 ?label 和 ?kw 不匹配,这不是我想要的。
我想要的是能够使用 FILTER NOT EXISTS,但这对于像 (?a = ?b)
这样的表达式是无效的;它只适用于 {?a ?b ?c}
.
我怀疑在 SPARQL 中有一种表达 FILTER NOT EXISTS (?a = ?b)
的正确方法,但我不知道它是什么。有人可以帮忙吗?
诀窍是将用于匹配关键字的三重模式放在 FILTER NOT EXISTS
中,如下所示:
SELECT *
WHERE {
?concept skos:prefLabel ?label .
FILTER NOT EXISTS { ?concept ex:keyword ?kw .
FILTER(lcase(str(?label)) = lcase(str(?kw)))
}
}
此查询表示“我想要所有带有 preflabel 的概念,以便该概念没有匹配该 prefLabel 的关键字值”。