我是Sparql的新手。我有OWL格式的汽车本体。我正在尝试编写一个从我这里获取两个节点名称的查询,并显示它们之间的所有现有路径。 例如,如下图所示: example of my ontology's graph, 如果输入节点是G和E,它们之间的路径可以是 G c b e, G c a d b e, G c a thing b e, 我是
我已经使用apache Jena从Eclipse连接到我的本体。现在我需要编写上面提到的查询。有没有可以帮助我编写查询的例子?
答案 0 :(得分:0)
这不是SPARQL闪耀的用例。尽管SPARQL使用图形作为隐喻,但它并不是实现经典图形算法的理想选择。
在某些情况下,使用多个迭代查询实现内容可能最简单。 在其他情况下,使用SPARQL构建包含相关个体和属性断言的子图可能更容易,然后将其用作常用算法之一的输入。
请注意finding all paths between two nodes is NP-hard 的问题,因此减少需要考虑的节点数是一件好事。您可能希望改为查找顶部 k 最短路径 - 此主题的ESWC 2016挑战结果现在为available;遗憾的是,论文目前尚未自行存档或开放获取。
根据三重存储的实现和图的结构,找到 a 和 b 之间的某个路径中涉及的所有三元组可能是可行的。通过查找每个 c ,使 a owl:topObjectProperty + ?c 和?c owl:topObjectProperty + b'/ em>的。 这种查询也可能导致服务器融化,或者您的DBA将您绑在椅子上,并使用UPS部件做恶事。
有些系统提供了扩展功能,可以更轻松地实现此类算法 - 例如,AllegroGraph对first class paths提供了非标准支持。
答案 1 :(得分:0)
我认为最好的方法是为它实现一个算法!我不认为可以使用SPARQL或一些查询方法完成此任务。我在Java和Jena中实现了以下算法,以找到连接OWL本体中的一组节点的所有有向路径。您可以使用两个必需的节点作为输入。
给出图G= (V, E)
:
给定一组顶点,让我们称它们为vSet
;包含顶点vRoot
;我们需要在尊重以下内容的pSet
元素之间找到所有路径vSet
:
pSet
中某个路径的来源显示的任何顶点。pSet
中的任何路径必须包含vSet
的来源和目的地,且不得包含vSet
的任何其他顶点。 以下算法类似于BFS,它从vRoot
开始(根据上面的1),每次迭代生成每个当前路径一条边,直到它到达v1
的另一个顶点{ {1}};然后存储此到达路径并开始从vSet
开始生成一组新路径。
这是伪代码:
v1