Rdf SPARQL否定:所有foaf:非';t foaf:人员
我正在尝试编写一个SPARQL查询,它应该为我提供所有Rdf SPARQL否定:所有foaf:非';t foaf:人员,rdf,sparql,foaf,Rdf,Sparql,Foaf,我正在尝试编写一个SPARQL查询,它应该为我提供所有foaf:Agents,而不是foaf:Persons 我找不到解决这个问题的方法,因为像rdfs:subassof和rdf:type这样的所有属性都是传递的和自反的 我试过这个: SELECT * WHERE { ?x rdf:type foaf:Agent OPTIONAL { ?y rdf:type foaf:Person } FILTER ( !BOUND(?y) ) } 但是rdf:type似乎是可传递的,至少在JENA/A
foaf:Agents
,而不是foaf:Persons
我找不到解决这个问题的方法,因为像rdfs:subassof
和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
的传入/传出EDEG。在SPARQL 1.0中,如果要检查给定变量绑定上是否不存在边,则很难(不可能)做到这一点。但是,将为否定提供支持:
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 . }
}
前缀rdf:
前缀foaf:
选择代理
哪里
{
?代理rdf:类型foaf:代理。
筛选器不存在{?代理rdf:type foaf:Person.}
}
@Kingsley Idehen的方法(使用第三方SPARQL扩展)应该可以帮助您在短期内解决问题
通过Virtuoso SPARQL扩展
用于验证的端点
(LOD云缓存实例)
要在SPARQL 1.0中实现这一点,您必须编写:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
,SPARQL 1.1将引入新语法,使其更易于编写。以下是SPARQL 1.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 . })
}
前缀rdf:
前缀foaf:
选择不同的计数(?代理)
哪里
{
?代理rdf:类型foaf:代理。
筛选器(不存在{?代理rdf:type foaf:Person.})
}
现场示例链接:
但是如何在?x和?y之间建立关系?SPARQL 1.1肯定会有否定,2009年ISWC的工作组小组明确指出,SPARQL 1.1语法(如链接中指定的)实际上是
过滤器不存在现在(需要过滤器关键字)
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
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 . })
}