SPARQL否定:所有foaf:不是foaf的代理人:人

Jur*_*ass 11 rdf foaf sparql

我正在尝试编写一个SPARQL查询,它应该给我所有foaf:Agents不是foaf:Persons.

我无法看到将此OPTIONAL/BOUND构造应用于此问题的方法,因为所有属性都喜欢rdfs:subClassOf并且rdf:type具有传递性和反身性.

我试过这个:

SELECT * WHERE { 
?x rdf:type foaf:Agent 
OPTIONAL { ?y rdf:type foaf:Person } 
FILTER ( !BOUND(?y) ) }
Run Code Online (Sandbox Code Playgroud)

但是rdf:type似乎是传递性的,至少与JENA/ARQ/SDB一样.

Phi*_*l M 11

这不起作用的原因是因为您有两个单独的变量绑定(?x?y),它们在您的查询中是不相关的.因此?x必须绑定到结果集中(这是你想要的),但如果?y是未绑定的,你还没有学到任何新的东西?x.

更新:在理想的查询中,根本不需要?y; 你可以?x直接测试传入/传出的edegs .如果要检查给定变量绑定上是否存在边缘,那么在SPARQL 1.0中这很难(不可能?).但是,SPARQL 1.1将提供对否定的支持:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?agent
WHERE 
{
    ?agent rdf:type foaf:Agent .
    FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}
Run Code Online (Sandbox Code Playgroud)

@Kingsley Idehen的方法(使用第三方SPARQL扩展)应该可以帮助您在短期内解决问题.


小智 9

要在SPARQL 1.0中执行此操作,您必须编写:

SELECT * WHERE { 
     ?x rdf:type foaf:Agent 
     OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . } 
     FILTER ( !BOUND(?y) ) 
}
Run Code Online (Sandbox Code Playgroud)

正如Phil M所说,SPARQL 1.1将引入新的语法,使编写起来更加直接.