我正在使用SPARQL来构建查询,并想排除某些结果。
我知道FILTER NOT EXISTS可以用来完成任务。例如:
SELECT * {
?sub a ?type .
FILTER NOT EXISTS {?sub a :NotExpectedType.}
}
Run Code Online (Sandbox Code Playgroud)
但是在探索过程中,我偶然发现自己可以写作!a。这是有效的SPARQL查询,但结果与有所不同FILTER NOT EXISTS。例如:
SELECT * {
?sub a ?type .
?sub !a :NotExpectedType .
}
Run Code Online (Sandbox Code Playgroud)
那是什么!a意思呢?(我知道这a是的快捷方式rdf:type,但这还不能帮助我理解。)
!a是一个属性路径,它的意思是“长度为1且属性不是的路径rdf:type”。
SELECT ?x {
?x a ?type.
FILTER NOT EXISTS { ?x a :MyClass }
}
Run Code Online (Sandbox Code Playgroud)
上面的查询将查找?x不?x rdf:type :MyClass存在三元组的位置。
SELECT ?x {
?x a ?type.
?x !a :MyClass.
}
Run Code Online (Sandbox Code Playgroud)
该查询将查找除以外?x的三元组?x ?property :MyClass所在的位置。?propertyrdf:type