我想问一下如何最好地遍历图并且只返回基于复杂条件的子图,这些条件必须由从根到叶的所有节点满足。 换句话说,我需要一些机制,当不满足任何中间级别的条件时,遍历停止(没有嵌套节点被处理并返回到输出)
我们说我有以下图表:
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
有什么想法吗?谢谢。
答案 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中找到更多详细信息。