arangodb - 在所有顶点上具有多个条件过滤器的路径遍历
问题描述
我想执行路径遍历,在所有顶点上应用多个条件过滤器。
基本上我希望每个顶点都匹配a == true
或b == true
。
对于以下两者之一很容易做到这一点:
FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'stix_graph'
FILTER p.vertices[*].a ALL == true
RETURN p
甚至两种情况重聚:
FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'graph'
FILTER p.vertices[*].a ALL == true AND p.vertices[*].b ALL == true
RETURN p
但我不知道如何在每个顶点上实现其中一个a
或每个...b
解决方案
这是使用内联投影的示例 AQL:
FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'graph'
FILTER p.vertices[* RETURN CURRENT.a OR CURRENT.b] ALL == true
RETURN p
这是使用内联过滤器的示例 AQL:
FOR v, e, p IN 0..5 OUTBOUND 'objects/key' GRAPH 'graph'
FILTER COUNT(p.vertices[* FILTER CURRENT.a OR CURRENT.b]) == COUNT(p.vertices)
RETURN p
重要提示:这种方法只有在您遍历相对较小的图时才会表现良好。如果您的图形非常庞大且深度,则性能可能会受到影响,因为 ArangoDB 查询优化器将内联投影和内联过滤器都视为CalculationNode
. 即 ArangoDB 不会停止条件返回的第一个顶点上的遍历false
。它将不得不继续遍历,因为过滤条件具有计算值,并且它无法提前知道该计算的结果是否true
用于false
下一个顶点。所以,它会在底层做一些额外的遍历/计算,但它仍然会返回你期望的结果。
如果您想将此过滤器应用于一个非常大的图表,我相信正确的方法是为您的数据添加一些冗余并将其a == true
或b == true
值放入一个单独的属性中,您可以在过滤条件中有效地使用该属性。
推荐阅读
- html - svg 拉伸以填充宽度,改为添加边距
- ios - iOS BluetoothManager Private API 无法附加到蓝牙守护进程
- azure-devops - 是否可以向 DevOps 实例上的所有用户广播消息或电子邮件(与管道无关)
- r - 如何让 Shiny App 动态更改数据集
- bash - bash case 语句引用的行为与记录相同,但请解释
- arrays - 我有一些在 <> 中的字符串数据,我想将其转换为列表
- r - 如何使用 ggplot 有条件地在美国地图上着色?
- visual-studio-2022 - 如何修复 VS2022 预览版的更新 4 升级“C++/WinRT”
- typescript - 打字稿:强制键和值属于同一类型?
- multithreading - 同一工人上的螺栓的 Apache Storm 问题