12

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

我看不到将这个 OPTIONAL/BOUND 构造应用于这个问题的方法,因为所有属性都像rdfs:subClassOfandrdf:type是传递和自反的。

我试过这个:

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

但 rdf:type 似乎是可传递的,至少在 JENA/ARQ/SDB 中是这样。

4

5 回答 5

13

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

更新:在理想的查询中,根本不需要?y;您可以直接测试传入/传出的边缘?x。当您想要检查给定变量绑定上是否不存在边时,这在 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 扩展)应该可以帮助您在短期内解决问题。

于 2009-10-23T21:19:00.523 回答
9

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

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

正如 Phil M 所说,SPARQL 1.1 将引入新的语法,使编写起来更加简单。

于 2009-10-25T01:04:53.407 回答
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 
于 2009-10-24T14:32:46.377 回答
2

以下现在有效,由 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. 查询解决方案

  2. 查询定义

于 2013-04-13T16:39:54.100 回答
2

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

于 2011-09-06T09:13:01.997 回答