在Orient-DB

时间:2015-11-16 10:45:29

标签: lazy-evaluation orientdb graph-databases graph-traversal orient-sql

在当前项目中,我们需要在几乎完全连通的图中找到最便宜的路径,每个顶点对可以包含许多边。

我们开发了包含函数的a plugin

  1. 用于特殊遍历此图,以在执行TRAVERSE时降低类似路径的重复性。我们将其称为search()
  2. 用于从这种遍历的结果中特别有效地提取所需信息。我们将其称为extract()
  3. 用于根据目标参数提取最佳N条记录而不需要昂贵的ORDER BY。我们将其称为best()
  4. 但是结果查询在完整数据方面的表现仍然不尽人意。

    所以我们决定修改search()函数,以便它可以首先观察最佳边缘并修剪路径,通过使用best()函数的当前状态来导致绝对不希望的结果。
    整体解决方案实际上是Branch and Bound method

    的灵活实施

    结果查询(省略extract()步骤)应该看起来像

    SELECT best(path, <limit>) FROM (
       TRAVERSE search(<params>) FROM #<starting_point>
       WHILE <conditions on intermediate vertixes>
      ) WHERE <conditions on result elements> 
    

    非常需要此表单,因此我们可以根据WHILEWHERE调整条件以适应当前任务。 path字段由search()生成,其中包含best()要继续的所有信息。

    问题是best()函数在search()函数之后严格执行,因此search()无法根据best()已经评估的结果修剪非最佳分支。 / p>

    所以问题是:
    TRAVERSE处理的早期路径之后,有没有办法将SELECT步骤到TRAVERSE步骤的结果与search() d SELECTbest()的方式相关联。与 B / \ G C / \ \ M H D \ \ \ N I E / \ J F / \ \ O K G

0 个答案:

没有答案