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

msc*_*c87 1 rdf ontology instance sparql protege

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

在此输入图像描述

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

Jos*_*lor 5

这不是太难.在RDF中,您的数据可以像图表的直接编码一样简单:

@prefix : <urn:ex:>

:A :connectedTo :B .
:B :connectedTo :C, :D .
:D :connectedTo :F .
:F :connectedTo :E, :G .
Run Code Online (Sandbox Code Playgroud)

然后,使用SPARQL属性路径,您可以找到每个节点,以便有一个从A到它以及从它到EconnectedTo属性路径,包括AE本身:

prefix : <urn:ex:>

select ?mid where {
  :A :connectedTo* ?mid .
  ?mid :connectedTo* :E .
}
Run Code Online (Sandbox Code Playgroud)
-------
| mid |
=======
| :D  |
| :F  |
| :B  |
| :A  |
| :E  |
-------
Run Code Online (Sandbox Code Playgroud)

如果你想要按顺序排列,你可以另外计算A和"中间节点"之间的数量.(这在我的回答中有描述是否可以在SPARQL中获取RDF集合中元素的位置?)

prefix : <urn:ex:>

select ?mid (count(?premid) as ?i) where {
  :A :connectedTo* ?premid .
  ?premid :connectedTo* ?mid .
  ?mid :connectedTo* :E .
}
group by ?mid
Run Code Online (Sandbox Code Playgroud)

-----------
| mid | i |
===========
| :D  | 3 |
| :F  | 4 |
| :E  | 5 |
| :B  | 2 |
| :A  | 1 |
-----------
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个或多或少看起来像"A,B,C,D,E,F"的单个结果,那么你可以使用我对SPARQL查询的聚合结果的答案中的技术来调整这些查询,该结果显示了如何连接这些成一个字符串.

  • 如果链接是无向的,那么您将无法使用属性路径执行此操作; 由于无法指定属性路径的*length*,因此无法区分A,B,A,C,D等路径以及较短的A,C,D路径.另外,它不是伟大的做法,以显着改变Stack Overflow问题; 它使现有答案无效,导致混淆,如果问题确实存在显着差异,通常值得问一个新问题. (3认同)