查询以查找OWL本体中两个节点之间的所有路径

时间:2016-06-22 12:02:37

标签: eclipse sparql jena owl

我是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连接到我的本体。现在我需要编写上面提到的查询。有没有可以帮助我编写查询的例子?

2 个答案:

答案 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)

  1. 执导,
  2. 无环的,
  3. 非加权,
  4. 在两个顶点之间可能有多个边缘(因此,源和目标不足以确定边缘)。
  5. 给定一组顶点,让我们称它们为vSet;包含顶点vRoot;我们需要在尊重以下内容的pSet元素之间找到所有路径vSet

    1. 必须可以从vRoot访问作为pSet中某个路径的来源显示的任何顶点。
    2. pSet中的任何路径必须包含vSet的来源和目的地,且不得包含vSet的任何其他顶点。
    3. 以下算法类似于BFS,它从vRoot开始(根据上面的1),每次迭代生成每个当前路径一条边,直到它到达v1的另一个顶点{ {1}};然后存储此到达路径并开始从vSet开始生成一组新路径。

      这是伪代码:

      v1