通过关系提取连接两个实例的实例链

时间:2015-08-11 09:28:41

标签: instance rdf sparql ontology protege

我想通过询问SPARQL查询来提取我的本体的两个实例之间的实例链。例如,在下图中,如果我想知道A如何连接到E,则查询的结果应该类似于A,B,D,F,E的列表。

enter image description here

应该如何设计本体并建立查询? 它甚至可能吗?

1 个答案:

答案 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}的回答中的技巧来调整这些查询,它显示了如何将这些连接成一个字符串。