问题描述
在我公司的分类法中,所有概念都具有 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中使用!=
只会返回?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相匹配的关键字值”。