如何强制Jena API的findShortestPath方法在<owl#onProperty>而不是<owl#someValuesFrom>上执行BFS?

时间:2019-11-11 19:12:23

标签: java sparql rdf jena

我正在尝试使用Jena的上述方法在本体中找到最短路径或两个节点之间的路径。

给定本体的任何两个节点,我的最终目标是使用此路径创建一个SPARQL查询来查询两个节点上的数据,并且需要一个路径,因为SPARQL需要如下路径(如果两个节点不是直接连接)

SELECT ?var1 ?var3 
WHERE {
?var1 <someProperty> ?var2.
?var2 <someProperty> ?var3.
}

目前,我正在使用Jena获取连接的大多数节点的路径,但是它们之间的关系是

[[http://myontology/Node1, http://www.w3.org/2000/01/rdf-schema#subClassOf, cbc3c5-d026-49-94d9-e3ba],
[cf3c5-d026-49-94d9-e3ba, http://www.w3.org/2002/07/owl#someValuesFrom, http://myontology/Node2]]

and so on till Node3.

我希望路径为

[[http://myontology/Node1, http://myontology/myPropertyABC , http://myontology/Node2,]
[http://myontology/Node2, http://myontology/myPropertyXYZ , http://myontology/Node3]]

我当前将查询构建为

SELECT ?var1 ?var3 
WHERE {
?var1 ?x ?var2.
?var2 ?y ?var3.
}

这为我提供了答案,但它是一个未经优化的查询,因此我更愿意生成基于属性的查询。我尝试通过优先处理整个BFS跟踪来演练最短路径方法,并发现它确实在owl#onProperty上进行搜索。因此,在为方法提供onPath参数时,如何构造对象以强制仅查看onProperty? (PS-欢迎使用其他任何方式实现目标)

方法签名是

public static Path findShortestPath( Model m, Resource start, RDFNode end, Predicate<Statement> onPath )

例如,当末端节点以相反的方式与路径相关时,Jena在很多情况下根本找不到路径

Node1 -> Node2 -> Node3 -> Node4 <- Node5.

将到达Node4,但无法到达Node5。这限制了处理整个图形的能力,并且只解决了前向关系。

也欢迎任何其他实现此功能的RDF API(基于python或java)。 (看着rdf4j和protege,但似乎jena仅具有此遍历功能)

非常感谢您的帮助! 如果需要其他详细信息,请告诉我。

0 个答案:

没有答案