匹配由cypher中的多个关系组成的递归模式

时间:2016-05-04 11:41:47

标签: neo4j cypher

假设我有一个数据库模型,如图(1)所示,其中每个人都有一个年龄属性,我想查询所有二阶儿童,这是一个女儿的儿子(年龄> 50岁)节点。对于给定的数据库方案,我从Bob开始的预期结果是[Tim,Sam]。

enter image description here

我已经尝试过'*'运算符来查询变量长度的关系,但到目前为止还无法使它工作。我试过了

START bob=node(0) MATCH (bob)-[:daughter*]->(p:Person)-[:son*]->(s)
WHERE p.age > 50 RETURN bob, sbob, s

只返回Bob和Tim,以及

MATCH (:Person)-[:daughter*]->(p:Person)-[:son*]->(s) 
WHERE p.age > 50 RETURN collect(s)

给了我[Tim,Bob,Tom,Sam]。

有没有办法在不改变数据库结构的情况下获得我期望的结果?

更新 作为额外要求,沿路径的所有daugthers必须大于50,即如果Tina为48且Carmen为52(实际上不可能),则返回空集合(儿子的年龄无关紧要)。

1 个答案:

答案 0 :(得分:0)

//
// Find daughters with age > 50
MATCH (bob:Person {name:'Bob'}), path = (bob)-[:son|daughter*]->(d:Person)
  WHERE type( last(relationships(path)) ) = 'daughter' and d.age>50
//
// Check if all daughters at path over age 50
WITH d, nodes(path) as nodes, relationships(path) as rels,
     range( 0, length(path)-1 ) as index
  WHERE none( i in index 
                WHERE type( rels[i] ) = 'daughter' AND 
                      nodes[i+1]['age'] <= 50
        )    
//
// Find sons of daughter
MATCH (d)-[:son]->(s:Person)
RETURN collect(s)