!a在SPARQL中是什么意思?

ren*_*yun 3 sparql

我正在使用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,但这还不能帮助我理解。)

cyg*_*gri 6

!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