在 ArangoDB 中如何 select 多边过滤图中的节点?

In ArangoDB how to select a node in graph filter by multi edge?

这样的数据

a->b,c,d
b->c,d
d->a,b

这样查询

FOR n in Nodes
FOR v,e,p IN 1 ANY n GRAPH 'MyGraph'
// Only need a
// HOW TO WRITE: FILTER n have an edge to `b` and n have an edge to `d`

// This will select a,b,c
FILTER v._key in [ 'b', 'd' ]
RETURN p

我想 select 一个边到 b andd 的节点,而不是 bord,但是怎么办?

编辑

数据

insert {_key:'a'} in nodes
insert {_key:'b'} in nodes
insert {_key:'c'} in nodes
insert {_key:'d'} in nodes

insert {_from:'nodes/a',_to:'nodes/b'} into relate
insert {_from:'nodes/a',_to:'nodes/c'} into relate
insert {_from:'nodes/a',_to:'nodes/d'} into relate
insert {_from:'nodes/b',_to:'nodes/c'} into relate
insert {_from:'nodes/b',_to:'nodes/d'} into relate
insert {_from:'nodes/c',_to:'nodes/d'} into relate

一个非常愚蠢的解决方案是

for n in nodes
for v,e,p in 1 OUTBOUND n graph 'MyGraph'
filter v._key == 'b'
for v2,e2,p2 in 1 INBOUND v graph 'MyGraph'
sort v2._key == 'd'
return v2

但是这个查询只适用于两个条件,如果我需要一个条件我必须再写一个 for 查询。

我看到了几个您可以使用的查询。我添加了一个顶点 e 以显示当您有更多条件时它们的外观。

。性能最高的查询应该是:

FOR v IN 1 INBOUND 'nodes/b' graph 'MyGraph'
  FILTER length(FOR d IN 1 OUTBOUND v graph 'MyGraph'
    FILTER d._key == 'd'
    LIMIT 1
    RETURN 1) == 1
  FILTER length(FOR e IN 1 OUTBOUND v graph 'MyGraph'
    FILTER e._key == 'e'
    LIMIT 1
    RETURN 1) == 1
  RETURN v

该查询搜索 b 的邻居并过滤具有已建立邻居的子查询,并检查它们是否与 de 连接。

II。更透明但也更慢的查询:

LET b = (FOR v IN 1 INBOUND "nodes/b" graph 'MyGraph' RETURN v)
LET d = (FOR v IN 1 INBOUND "nodes/d" graph 'MyGraph' RETURN v)
LET e = (FOR v IN 1 INBOUND "nodes/e" graph 'MyGraph' RETURN v)
RETURN INTERSECTION(b, d, e)

查询对每个搜索到的节点和 returns 其邻居的交集进行子查询。

III。使用 bindVars 的非常通用的查询,但也是最慢的:

绑定参数:

{
    "targets": ["b","d","e"]
}

查询:

FOR n IN nodes
  LET neighbors = (FOR v,e,p IN 1 OUTBOUND n graph 'MyGraph'
    FILTER v._key IN @targets
    RETURN v._key)
FILTER @targets ALL IN neighbors
RETURN n

是的,它是最慢的,但是当您想添加更多条件时,您永远不必再更改查询本身。您只需更改绑定参数即可。