假设我有一个数据库模型,如图(1)所示,其中每个人都有一个年龄属性,我想查询所有二阶儿童,这是一个女儿的儿子(年龄> 50岁)节点。对于给定的数据库方案,我从Bob开始的预期结果是[Tim,Sam]。
我已经尝试过'*'运算符来查询变量长度的关系,但到目前为止还无法使它工作。我试过了
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(实际上不可能),则返回空集合(儿子的年龄无关紧要)。
答案 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)