在ArangoDB中如何通过多边缘选择图形过滤器中的节点?

时间:2017-03-15 07:42:37

标签: graph-theory arangodb aql

这样的数据

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

我想选择边缘为b d的节点,而不是b d,但是如何?

修改

数据

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查询。

1 个答案:

答案 0 :(得分:1)

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

<强> I 即可。最高效的查询应该是:

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)

查询为每个搜索到的节点进行子查询,并返回其邻居的交集。

<强> 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

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

相关问题