如何使用SPARQL筛选default graph(所有named graph外)的三元组
SPARQL 实现方案
你需要筛选仅存在于默认图、不在任何命名图中出现的:Entity类实体,核心是利用SPARQL 1.1的GRAPH关键字匹配命名图内容,再用FILTER NOT EXISTS排除掉在命名图中出现过的实体即可。
基础写法(匹配仅在默认图有类型声明的实体)
如果你只要求?s a :Entity这个类型三元组仅出现在默认图,不限制实体的其他属性三元组是否在命名图存在,用下面的语句:
SELECT ?s WHERE { # 匹配默认图中所有:Entity类型的实体 ?s a :Entity . # 排除所有在任意命名图中存在同类型声明的实体 FILTER NOT EXISTS { GRAPH ?g { ?s a :Entity . } } }
严格写法(匹配所有三元组都仅在默认图的实体)
如果你要求实体的所有相关三元组都只存在于默认图,完全不在任何命名图里出现,把GRAPH块里的匹配模式改成匹配实体的任意三元组即可:
SELECT ?s WHERE { ?s a :Entity . FILTER NOT EXISTS { GRAPH ?g { ?s ?p ?o . } } }
原理说明
- 标准SPARQL 1.1规范中,不在
GRAPH子句内的三元组模式默认仅匹配默认图内容 GRAPH ?g { 模式 }的匹配范围是数据集内所有命名图,不会覆盖默认图- 上述写法完全符合SPARQL 1.1标准,在所有兼容标准的三元组存储/查询引擎上都可正常运行
内容的提问来源于stack exchange,提问作者gaspanic
相关产品推荐
相关产品推荐

