SPARQL查询差异:为何一查询返回图名另一无结果?
RDF命名图查询问题:为何Query2无结果?
问题背景
我们维护两个RDF命名图:
ex:Main:存储对象的核心属性数据ex:DefaultValues:存储对象属性的默认值
执行Query1能正常返回带图名的查询结果,但结构类似的Query2却没有任何数据返回,需要明确二者差异,并实现获取ID1、ID2的height、description等属性所在图信息的需求。
示例数据
PREFIX ex: <http://example/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> INSERT DATA { GRAPH ex:Main { ex:ID1 a ex:Object . ex:ID1 rdfs:label "p1" . ex:ID1 ex:height 1.5 . ex:ID2 a ex:Object . ex:ID2 rdfs:label "p2" . ex:ID2 ex:description "p2 data" . } GRAPH ex:DefaultValues { ex:ID1 ex:description "" . ex:ID2 ex:height 0.0 . } }
对比查询
Query 1(有结果)
PREFIX ex: <http://example/> SELECT ?id ?p ?o ?g FROM NAMED ex:Main FROM NAMED ex:DefaultValues WHERE { VALUES ?id { ex:ID1 ex:ID2 } GRAPH ?g { ?id ?p ?o . } }
Query 2(无结果)
PREFIX ex: <http://example/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?id ?name ?height ?description ?g FROM NAMED ex:Main FROM NAMED ex:DefaultValues WHERE { VALUES ?id { ex:ID1 ex:ID2 } GRAPH ?g { ?id rdfs:label ?name . ?id ex:height ?height . ?id ex:description ?description . } }
差异原因
Query1的GRAPH ?g { ?id ?p ?o . }逻辑是:匹配任意图中该ID的单个三元组,只要某个图里存在该ID的任意属性,就会返回这条三元组和对应的图名,因此能匹配到两个图里的所有相关数据。
而Query2的GRAPH ?g { ... }块要求:某个图中同时存在该ID的rdfs:label、ex:height、ex:description三个三元组,但查看示例数据:
ex:Main中:ID1无description,ID2无heightex:DefaultValues中:ID1无label和height,ID2无label和description
没有任何一个图能同时满足某个ID的三个属性存在,因此Query2无匹配结果。
解决方案
要获取每个属性对应的所在图信息,需要将每个属性的匹配逻辑拆分,允许不同属性来自不同的图,使用OPTIONAL处理属性缺失的情况:
PREFIX ex: <http://example/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?id ?name ?height ?description ?name_g ?height_g ?description_g FROM NAMED ex:Main FROM NAMED ex:DefaultValues WHERE { VALUES ?id { ex:ID1 ex:ID2 } # 匹配label及其所在图 OPTIONAL { GRAPH ?name_g { ?id rdfs:label ?name . } } # 匹配height及其所在图 OPTIONAL { GRAPH ?height_g { ?id ex:height ?height . } } # 匹配description及其所在图 OPTIONAL { GRAPH ?description_g { ?id ex:description ?description . } } }
该查询会返回每个ID的所有属性值,以及对应属性所在的图名,缺失的属性会显示为null,完全满足需求。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

