这样的数据
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
查询。
答案 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
的邻居,并对已建立的邻居进行子查询过滤,并检查它们是否与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)
查询为每个搜索到的节点进行子查询,并返回其邻居的交集。
<强> 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
是的,它是最慢的,但是当您想要添加更多条件时,您永远不会再更改查询本身。您只需要更改绑定参数。