Rdf SPARQL否定:所有foaf:非';t foaf:人员

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

我正在尝试编写一个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/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 . })
    }