在 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
的邻居并过滤具有已建立邻居的子查询,并检查它们是否与 d
和 e
连接。
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
是的,它是最慢的,但是当您想添加更多条件时,您永远不必再更改查询本身。您只需更改绑定参数即可。
这样的数据
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
的邻居并过滤具有已建立邻居的子查询,并检查它们是否与 d
和 e
连接。
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
是的,它是最慢的,但是当您想添加更多条件时,您永远不必再更改查询本身。您只需更改绑定参数即可。