SPARQL否定:所有foaf:不是foaf的代理人:人
题
我正在尝试编写一个SPARQL查询,该查询应该为我提供所有 foaf:Agents
,它们不是 foaf:Persons
。
我无法找到一种方法来应用此可选/绑定构造这个问题,因为所有属性,如 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一样。
解决方案
这不起作用的原因是因为你有两个独立的变量绑定(?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扩展)应该可以帮助您在短期内解决问题。
其他提示
要在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将引入新的语法,使其更易于编写。
这是(草案)SPARQL 1.1否定规范: http:// www。 w3.org/TR/sparql11-query/#negation
通过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
不隶属于 StackOverflow