如何表达两个连续的可变长度关系的条件?
考虑此部分查询
MATCH(t1:Type{myID: 1})-[r:relType]->(:Type)-[rels:relType*0..]-(t2:Type{myID:100})
WHERE r.attr1>10
基本上,我试图说的是,从t1
到t2
之间可能存在一种或多种关系。第一个关系r
的属性应满足给定条件。
如果这是两个节点之间的唯一关系,那没关系。
至少存在另一个关系,我想添加另一个条件,例如:
WHERE r.attr1>10 AND r_next.attr2> r_prev.attr2+r_prev.attr1
其中r_next
和r_prev
是连续关系:()-[r_prev]->()-[r_next]-()
。请注意,第一步r_prev
是第一个关系r
。
我知道rels
是一个集合,但我不知道如何表达这种条件。
答案 0 :(得分:0)
像这样的连续比较目前还不容易,并且目前无法在扩展期间进行评估。
您可以在此之后进行一些过滤,但这会很丑。
我们将使用apoc.coll.pairsMin()
的APOC程序,该程序将进行收集并返回相邻对的列表。
MATCH (t1:Type{myID: 1}), (t2:Type{myID:100})
MATCH (t1)-[r:relType]->(:Type)-[rels:relType*0..]-(t2)
WHERE r.attr1>10
WITH t1, t2, apoc.coll.pairsMin(rels) as pairs
WHERE all(pair in pairs WHERE pair[0].attr1 + pair[0].attr2 < pair[1].attr2)
RETURN t1, t2 //or whatever you want to return from this