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

时间:2009-10-23 19:33:13

标签: rdf sparql foaf

我正在尝试编写一个SPARQL查询,该查询应该为我提供foaf:Agents的所有foaf:Persons

我看不到将this OPTIONAL/BOUND construct应用于此问题的方法,因为rdfs:subClassOfrdf:type等所有属性都具有传递性和反身性。

我试过了:

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

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

5 个答案:

答案 0 :(得分: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 . }
}

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

答案 1 :(得分:9)

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

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

As Phil M says,SPARQL 1.1将引入新的语法,使写入更加直接。

答案 2 :(得分:2)

  

通过Virtuoso SPARQL Extensions   验证端点   http://lod.openlinksw.com/sparql(LOD云缓存实例)

SELECT distinct ?x ?o 
WHERE { 
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 10
DESCRIBE ?x 
WHERE { 
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 200 

答案 3 :(得分:2)

这是(草案)SPARQL 1.1否定规范:http://www.w3.org/TR/sparql11-query/#negation

答案 4 :(得分:1)

现在,以下内容适用于SPARQL 1.1:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
SELECT DISTINCT COUNT(?agent)
WHERE 
{
    ?agent rdf:type foaf:Agent .
    FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}

实例示例链接:

  1. Query Solution

  2. Query Definition