Neo4j可选匹配实际上并不等同于SQL外部联接
我想返回一个集合中的所有行,其中只有一些行与另一个集合有关系。例如,以下是我的节点:Neo4j可选匹配实际上并不等同于SQL外部联接,neo4j,outer-join,Neo4j,Outer Join,我想返回一个集合中的所有行,其中只有一些行与另一个集合有关系。例如,以下是我的节点: CREATE (n1:Union{UID:1}) CREATE (n2:Union{UID:2}) CREATE (n3:Union{UID:3}) CREATE (n4:Union{UID:4}) CREATE (n5:Union{UID:5}) CREATE (p1:Person{RN:1}) CREATE (p2:Person{RN:2}) CREATE (p3:Person{RN:3})
CREATE (n1:Union{UID:1})
CREATE (n2:Union{UID:2})
CREATE (n3:Union{UID:3})
CREATE (n4:Union{UID:4})
CREATE (n5:Union{UID:5})
CREATE (p1:Person{RN:1})
CREATE (p2:Person{RN:2})
CREATE (p3:Person{RN:3})
CREATE (p4:Person{RN:4})
CREATE (p5:Person{RN:5})
和关系
match (a:Union{UID:1}),(b:Person{RN:1})
create (a)-[:Child]->(b)
match (c:Union{UID:1}),(d:Person{RN:2})
create (c)-[:Child]->(d)
match (e:Union{UID:5}),(f:Person{RN:5})
create (e)-[:Child]->(f)
当我运行此查询时
optional match (u:Union)-[:Child*0..1]->(c:Person)
with u.UID as UID,case when c is not NULL then collect(c.RN) else NULL end as child
return UID,child order by UID
结果是
UID child
1 [1, 2]
5 [5]
我要找的是
UID Child
1 [1,2]
2 NULL
3 NULL
4 NULL
5 [5]
我该怎么做呢?问题是您对整个模式进行了可选匹配,并且期望它按照您想要的方式运行是不正确的,而且效率极低,因为它必须匹配两侧的所有节点。您需要在您希望位于其中的节点上进行匹配,然后在其余节点上进行可选匹配:
match (u:Union)
optional match (u)-[:Child*0..1]->(c:Person)
with u, collect(c.RN) as child
return u.UID as UID, case when size(child) = 0 then null else child end
order by UID
完美的这正是我们想要的。