我正在尝试编写一个SPARQL查询,它应该给出所有不是foaf:Persons的foaf:Agents。
我看不到将this OPTIONAL/BOUND construct应用于这个问题的方法,因为像rdfs:subClassOf和rdf:type这样的所有属性都是可传递的和自反的。
我试过这个:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person }
FILTER ( !BOUND(?y) ) }但是rdf:type似乎是可传递的,至少对于JENA/ARQ/SDB是这样。
发布于 2009-10-24 05:19:01
这不起作用的原因是因为您有两个独立的变量绑定(?x和?y),它们在查询中是不相关的。因此,必须绑定?x才能出现在结果集中(这正是您想要的),但是如果取消绑定?y,您就没有学到任何关于?x的新知识。
更新:在理想的查询中,根本不需要?y;您可以直接测试?x的传入/传出edeg。这很难(不可能?)当您想要检查给定变量绑定上是否不存在边时,可以在SPARQL1.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-25 09:04:53
要在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,SPARQL1.1将引入新的语法,使其更易于编写。
发布于 2009-10-24 22:32:46
通过Virtuoso SPARQL扩展端点验证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 10DESCRIBE ?x
WHERE {
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 200 https://stackoverflow.com/questions/1615472
复制相似问题