AQL - 图形遍历 - 在具有复杂条件的路径上进行过滤

时间:2017-09-01 08:58:35

标签: arangodb aql

我想问一下如何最好地遍历图并且只返回基于复杂条件的子图,这些条件必须由从根到叶的所有节点满足。 换句话说,我需要一些机制,当不满足任何中间级别的条件时,遍历停止(没有嵌套节点被处理并返回到输出)

我们说我有以下图表:

A -> B -> C (active=false) -> D

我停用了节点C(注意标志active = false表示所有子图都被停用,包括C和D)。

根据文档,我可以通过路径过滤,通配符[*]和ALL关键字轻松构建这样的过滤器,当不满足C上的条件时,它也会停止遍历。条件简单,效果很好:

for v,e,p in 1..100 outbound 'test/A' graph 'testGraph'
  filter p.vertices[*].active ALL != false return v
  // returns A, B

现在我有另一个图表,其中每个节点都是固定的或具有一些有效时间跨度(从,到)属性:

A (type="fixed") -> B (from=2,to=3) -> C (from=1, to=5) -> D (type="fixed")

现在我想只返回所有(中间)节点固定或满足从> = 2到< = 3的时间条件的子图。我需要返回A,B。

for v,e,p in 0..100 outbound 'test/A' graph 'testGraph'
  filter p.vertices[*].type ALL == 'fixed' or
    (p.vertices[*].from ALL >= 2 and p.vertices[*].from ALL <= 3)
  return v

然而这显然是错误的(并且只返回A),逻辑上我需要在条件的开头添加ALL关键字(我需要在每个级别上应用条件,并且当条件不满足时,遍历停止),但不支持:

filter ALL(p.vertices[*].type == 'fixed' or
  (p.vertices[*].from >= 2 and p.vertices[*].from <= 3)

通过过滤顶点的经典方法不符合我的需要,因为当条件不满足时它不会停止遍历,即后面的返回A,B,D(C被跳过但我也需要修剪C的子树使得D不在输出上):

for v,e,p in 0..100 outbound 'test/A' graph 'testGraph'
  filter  v.type == 'fixed' or 
    (v.from >= 2 and v.from <= 3)
  return v

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

AQL <html><head></head><body> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>date</th> <th>data_class</th> <th>missing_count</th> <th>expected_device_count</th> <th>expected_device_online</th> <th>missing_count_for_device_online</th> </tr> </thead> <tbody> </tbody> </table> Against ah_unit <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>date</th> <th>data_class</th> <th>missing_count</th> <th>expected_device_count</th> <th>expected_device_online</th> <th>missing_count_for_device_online</th> </tr> </thead> <tbody> </tbody> </table>3 How many devices have bad storageid's in tm_devicestorage <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>date</th> <th>bad_storage_id_data_count</th> <th>bad_storage_id_data_count_last_week</th> </tr> </thead> <tbody> </tbody> </table> </body></html> 功能在ArangoDB版本3.4.5和3.5.0中引入。使用AQL关键字PRUNE时,如果满足顶点,边,路径或之前之前定义的任何变量的条件,则停止遍历。

  

修剪是制定条件以减少搜索期间要检查的数据量的最简单变体。因此,它可以提高查询性能并减少查询所产生的开销。修剪可以在顶点,边缘和路径以及之前定义的任何变量上执行。

video tutorial通过动手示例显示了FILTER和新PRUNE之间的区别。您可以在documentation中找到更多详细信息。