SPARQL 属性 path - 只检索最近的节点

SPARQL property path - Retrieve the closest node only

假设我们有一个 ontology 记录日志事件,有 2 种不同类型的事件:infowarning。每个条目都通过非传递性 属性 hasPreviousEvent 链接到前一个条目,如下所示:

对于所有 info 节点,我想检索最近的 error 节点,无论它返回多少跳。理想情况下,对于上述示例数据集,我希望得到以下结果集:

条目 上一篇
:info_2 :error_1
:info_3 :error_2
:info_4 :error_2

使用SPARQL 属性路径,查询如下

SELECT * WHERE { 
?entry rdf:type :Info ;
    :hasPreviousEntry* ?prev .
?prev rdf:type :Error .
} ORDER BY ?entry

合理地检索到以下结果集:

条目 上一篇
:info_2 :error_1
:info_3 :error_1
:info_3 :error_2
:info_4 :error_1
:info_4 :error_2

我找不到如何获得想要的结果。任何帮助将不胜感激。

检查不存在由 ?entry 链接的另一个错误,该错误至少在一个步骤中又链接到 ?prev

SELECT * WHERE { 
  ?entry rdf:type :Info ;
         :hasPreviousEntry* ?prev .
  ?prev rdf:type :Error .
  FILTER NOT EXISTS {
    ?entry :hasPreviousEntry* [ rdf:type :Error ;
                                :hasPreviousEntry+ ?prev ] .
  }
} ORDER BY ?entry