我正在尝试使用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仅具有此遍历功能)
非常感谢您的帮助! 如果需要其他详细信息,请告诉我。