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

extracting a chain of instances connecting two instances through a relatio

我想通过询问 SPARQL 查询来提取我的 ontology 的两个实例之间的实例链。例如下图中,如果我想知道A和E是如何连接的,查询的结果应该是A、B、D、F、E的列表。

ontology 应该如何设计和构建查询? 有可能吗?

这并不难。在 RDF 中,您的数据可以是简单的图形直接编码:

@prefix : <urn:ex:>

:A :connectedTo :B .
:B :connectedTo :C, :D .
:D :connectedTo :F .
:F :connectedTo :E, :G .

然后,使用 SPARQL 属性 路径,您可以找到每个节点,使得 connectedTo 属性的路径来自 A 到它并从它到 E,包括 AE 本身:

prefix : <urn:ex:>

select ?mid where {
  :A :connectedTo* ?mid .
  ?mid :connectedTo* :E .
}
-------
| mid |
=======
| :D  |
| :F  |
| :B  |
| :A  |
| :E  |
-------

如果你想把它们整理好,你可以另外计算A和"mid-node"之间有多少东西。 (这在我对 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 |
-----------

如果你真的想要一个看起来或多或少像 "A, B, C, D, E, F" 的结果,那么你可以使用我对 Aggregating results from SPARQL query 的回答中的技术来调整这些查询,它展示了如何将这些查询连接成一个单个字符串。