SPARQL逆查询处理:如何用^运算符查询位于Sun下方的所有实体
结论
你完全可以使用SPARQL 1.1标准支持的脱字符运算符^实现该逆属性查询需求,^ab:above就完全匹配你定义的"below是above的逆属性"的逻辑。
^的作用是反转属性的匹配方向:对于存在的三元组?subject ?property ?object,?object ^?property ?subject的匹配逻辑和原三元组完全等价。放到你的场景里,三元组ab:Sun ab:above ab:Mountains就等价于ab:Mountains ^ab:above ab:Sun,刚好对应"Mountains在Sun下面"的语义。
具体操作步骤
第一步:先修正RDF数据的笔误
你给出的RDF数据中ab:Mountains" ab:name "Mountains".一行多了一个末尾双引号,修改为ab:Mountains ab:name "Mountains".即可正常解析。第二步:编写对应需求的SPARQL查询
场景1:查询直接在Sun下方的实体
以下两种写法查询结果完全一致:
PREFIX ab: <http://www.example.org/assignment#> # 写法1:正向匹配ab:Sun的ab:above指向对象 SELECT ?below_object ?object_name WHERE { ab:Sun ab:above ?below_object . ?below_object ab:name ?object_name . }
PREFIX ab: <http://www.example.org/assignment#> # 写法2:逆属性匹配,直接对应below语义 SELECT ?below_object ?object_name WHERE { ?below_object ^ab:above ab:Sun . ?below_object ab:name ?object_name . }
该查询返回的结果为Mountains。
场景2:查询所有直接+间接在Sun下方的实体
如果需要匹配所有层级低于Sun的实体,将逆属性和属性路径通配符+结合即可,+代表匹配路径1次及以上,不会包含Sun本身:
PREFIX ab: <http://www.example.org/assignment#> SELECT ?below_object ?object_name WHERE { ?below_object ^ab:above+ ab:Sun . ?below_object ab:name ?object_name . }
该查询返回的结果为Mountains、River、House、Land、Boat。
如果需要把Sun本身也包含在结果里,把+替换为*即可,*代表匹配路径0次及以上。
内容的提问来源于stack exchange,提问作者Yash Singhal
相关产品推荐
相关产品推荐

