表达两个连续可变长度关系的条件?

时间:2019-07-17 15:25:53

标签: graph neo4j cypher graph-databases variable-length

如何表达两个连续的可变长度关系的条件?

考虑此部分查询

MATCH(t1:Type{myID: 1})-[r:relType]->(:Type)-[rels:relType*0..]-(t2:Type{myID:100})
WHERE r.attr1>10

基本上,我试图说的是,从t1t2之间可能存在一种或多种关系。第一个关系r的属性应满足给定条件。

如果这是两个节点之间的唯一关系,那没关系。

至少存在另一个关系,我想添加另一个条件,例如:

WHERE  r.attr1>10 AND r_next.attr2> r_prev.attr2+r_prev.attr1

其中r_nextr_prev是连续关系:()-[r_prev]->()-[r_next]-()。请注意,第一步r_prev是第一个关系r

我知道rels是一个集合,但我不知道如何表达这种条件。

1 个答案:

答案 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