我是学习Sparql的新手。我想知道有没有办法查询节点之间没有直接关系 假设我在RDF中有以下三元组
book - created_by - 作者
作家 - 工作 - 公司
公司 - 位置 - 位置
我可以在Sparql中编写查询来查找给定论文作者的位置 我们只有纸质信息 我们想要检索位置
不知道之间的关系 作家 - 工作 - 公司
公司 - 位置 - 位置
更新: 我想知道sparql是否具有类似于xquery和xpath中的//的功能 //从当前节点中选择与选择匹配的文档中的节点,无论它们位于何处
答案 0 :(得分:1)
假设您有这样的数据(三本书,三位作者,两家公司(两位作者在同一家公司工作)和两个位置(每家公司一位)):
@prefix : <https://stackoverflow.com/q/23066695/1281433/>.
:book1 a :Book; :createdBy :author1 .
:book2 a :Book; :createdBy :author2 .
:book3 a :Book; :createdBy :author3 .
:author1 a :Author; :worksFor :company1.
:author2 a :Author; :worksFor :company2.
:author3 a :Author; :worksFor :company2.
:company1 a :Company; :locatedIn :location1.
:company2 a :Company; :locatedIn :location2.
:location1 a :Location.
:location2 a :Location.
然后,您可以使用此类查询来获取将图书与地理位置相关联的结果:
prefix : <https://stackoverflow.com/q/23066695/1281433/>
select ?book ?location where {
?book a :Book; (:|!:)* ?location .
?location a :Location .
}
-----------------------
| book | location |
=======================
| :book1 | :location1 |
| :book2 | :location2 |
| :book3 | :location2 |
-----------------------
这里的技巧是使用相当于通配符的属性路径。每个IRI都是:
或者不是,因此路径:|!:
匹配每个属性。这意味着路径(:|!:)*
是通配符路径。通过要求?book
和?location
分别具有类型:Book
和:Location
,我们找到了从书籍到地点的路径。 有关带通配符的属性路径的详情,请参阅SPARQL: property paths without specified predicates和sparql complete tree from subject。
当然,这里可能存在问题。 RDF图是有向图,任何东西都可以与其他任何东西相关。这意味着,如果您有:location2 :northOf :location1
之类的关系,那么现在有一条从:book3
到:location1
的路径。这可能不是你所期待的。