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

完美的这正是我们想要的。