我在ArangoDB中有一个图,它有两个顶点集合,P和F,以及一个边集合,有两种类型的边:fp和hp。
请注意,上面的图像已经简化 - “F”节点通过更多“fp”边缘将自身连接到其他F节点。换句话说,我事先并不知道(例如)“F4”是否有入站“fp”边缘或更多。
我想使用一个AQL查询来遍历图形,从节点PA开始,但在任何没有入站“hp”边缘的顶点处停止。 Documentation表示停止遍历的方法是使用如下查询:
FOR v, e, p IN 0..100 OUTBOUND 'P/PA'GRAPH 'test'
FILTER p.<vertices|edges>... <condition>
RETURN v
我想看看:
PA, PC, PE, PF
但是我不知道如何在没有首先在“P”节点上填充新属性表明它们具有入站“fp”边缘的情况下实现这一点。如果我这样做,那么这将是可能的:
FOR v, e, p IN 0..100 OUTBOUND 'P/PA'GRAPH 'test'
FILTER p.vertices[*].hasFP ALL == true
RETURN v
在一个AQL查询中,有没有办法在没有预处理步骤的情况下实现这一目标?
答案 0 :(得分:1)
您可以使用以下查询执行此操作。它会在您的起始点P/PA
处开始遍历并检查是否没有连接边缘(起始点本身需要)或边缘的type
是hp
。然后,它为每个找到的顶点开始另一次遍历,直接或间接与P/PA
连接,深度为1,方向为INBOUND
。这里它过滤边type
等于fp
并从周围遍历返回顶点。您需要DISTINCT
RETURN
,否则您的起点将被退回两次。
FOR v, e, p IN 0..100 OUTBOUND 'P/PA' GRAPH 'test'
FILTER e == null
OR e.type == 'hp'
FOR v1, e1, p1 IN 1 INBOUND v._id GRAPH 'test'
FILTER e1.type == 'fp'
RETURN DISTINCT v
答案 1 :(得分:0)
如果我正确理解了问题,答案是:使用子查询来检查条件。不幸的是,目前,AQL不支持修剪,所以(使用当前版本,即3.2),这种方法可能太慢了。
简而言之,子查询看起来像这样:
(FOR v0 IN p.vertices
LET hasP = (FOR v1, e1 IN 1..1 INBOUND v0 GRAPH “test”
FILTER e1.type == “fp”
COLLECT WITH COUNT INTO c
RETURN c>0)
FILTER hasP
COLLECT WITH COUNT INTO c
RETURN c == LENGTH(p.vertices) )