首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARQL否定:所有foaf:不是foaf的代理

SPARQL否定:所有foaf:不是foaf的代理
EN

Stack Overflow用户
提问于 2009-10-24 03:33:13
回答 5查看 6.6K关注 0票数 12

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

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

我试过这个:

代码语言:javascript
复制
SELECT * WHERE { 
?x rdf:type foaf:Agent 
OPTIONAL { ?y rdf:type foaf:Person } 
FILTER ( !BOUND(?y) ) }

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-24 05:19:01

这不起作用的原因是因为您有两个独立的变量绑定(?x?y),它们在查询中是不相关的。因此,必须绑定?x才能出现在结果集中(这正是您想要的),但是如果取消绑定?y,您就没有学到任何关于?x的新知识。

更新:在理想的查询中,根本不需要?y;您可以直接测试?x的传入/传出edeg。这很难(不可能?)当您想要检查给定变量绑定上是否不存在边时,可以在SPARQL1.0中执行此操作。但是,SPARQL 1.1将提供对否定的支持:

代码语言:javascript
复制
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扩展)应该会在短期内帮助您解决问题。

票数 13
EN

Stack Overflow用户

发布于 2009-10-25 09:04:53

要在SPARQL 1.0中做到这一点,您必须编写:

代码语言:javascript
复制
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将引入新的语法,使其更易于编写。

票数 9
EN

Stack Overflow用户

发布于 2009-10-24 22:32:46

通过Virtuoso SPARQL扩展端点验证http://lod.openlinksw.com/sparql (LOD云缓存实例)的

代码语言:javascript
复制
SELECT distinct ?x ?o 
WHERE { 
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 10
代码语言:javascript
复制
DESCRIBE ?x 
WHERE { 
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } ))) 
} 
limit 200 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1615472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档