我想通过询问SPARQL查询来提取我的本体的两个实例之间的实例链。例如,在下图中,如果我想知道A如何连接到E,则查询的结果应该类似于A,B,D,F,E的列表。
应该如何设计本体并建立查询? 它甚至可能吗?
答案 0 :(得分:5)
这并不难。在RDF中,您的数据可以像图表的直接编码一样简单:
@prefix : <urn:ex:>
:A :connectedTo :B .
:B :connectedTo :C, :D .
:D :connectedTo :F .
:F :connectedTo :E, :G .
然后,使用SPARQL属性路径,您可以找到每个节点,以便从 A 到 A 的路径,并从中 E ,包括 A 和 E 本身:
prefix : <urn:ex:>
select ?mid where {
:A :connectedTo* ?mid .
?mid :connectedTo* :E .
}
-------
| mid |
=======
| :D |
| :F |
| :B |
| :A |
| :E |
-------
如果您想要按顺序排列,可以另外计算 A 和&#34; mid-node&#34;之间的数量。 (这在我对Is it possible to get the position of an element in an RDF Collection in SPARQL?)
的回答中有所描述prefix : <urn:ex:>
select ?mid (count(?premid) as ?i) where {
:A :connectedTo* ?premid .
?premid :connectedTo* ?mid .
?mid :connectedTo* :E .
}
group by ?mid
-----------
| mid | i |
===========
| :D | 3 |
| :F | 4 |
| :E | 5 |
| :B | 2 |
| :A | 1 |
-----------
如果您确实想要一个看起来或多或少类似于&#34; A,B,C,D,E,F&#34;的结果,那么您可以使用我对{{3}的回答中的技巧来调整这些查询,它显示了如何将这些连接成一个字符串。