neo4j图数据库,如何合并数据集?union/union all有何区别?
发布于 作者:苏南大叔 来源:程序如此灵动~
根据节点的不同标签进行数据查询,这是在neo4j世界里面的基本操作。但是,如果想合并两个不同标签的数据呢?其中一个可能的解决方案就是union,它可以把两个不同的match数据合并到一起。还有个类似的操作叫做union all,两者有什么区别呢?这个也是本文中要探讨的问题。

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文讲述在neo4j图数据库中,如何使用union语句和union all语句。测试环境:win10,neo4j社区版@4.4.6,java@11.0.14。
测试数据集
这个文章里面,苏南大叔采用了一个自己的数据集。语句如下:
CREATE (a:Dog {name: '虎子',color:'yellow'}),
(b:Dog {name: '小黑',color:'black',good:'true'}),
(c:Dog {name: '二赖子',color:'white',type:'lovely'}),
(d:Cat {name: '老许',color:'black'}),
(e:Cat {name: '小黑',color:000000}),
(a)-[:Friend]->(b),
(a)-[:Friend]->(c),
(a)-[:Friend]->(d),
(b)-[:Friend]->(e),
(c)-[:Friend]->(d);如果您需要清空数据库,可以使用:
MATCH (n) DETACH DELETE n显示所有数据,可以使用:
MATCH (n) return n
union all不去重
猫猫狗狗都是宠物,那么,现在想知道都有哪些宠物呢?
MATCH (n:Cat) RETURN n.name AS name,'catty' as type
UNION ALL
MATCH (n:Dog) RETURN n.name AS name,'doggy' as type
MATCH (n:Cat) RETURN n.name AS name
UNION ALL
MATCH (n:Dog) RETURN n.name AS name
可以看到,这里有两个叫做“小黑”的宠物,一个是猫猫,一个是狗狗。
union去重
两个宠物复用了同一个名字“小黑”,现在需求变成:现在宠物都有什么哪些名字?这里不使用union all,而使用union。
MATCH (n:Cat) RETURN n.name AS name,'catty' as type
UNION
MATCH (n:Dog) RETURN n.name AS name,'doggy' as type
MATCH (n:Cat) RETURN n.name AS name
UNION
MATCH (n:Dog) RETURN n.name AS name
这里因为字段名字都叫name,所以不使用as也是可以的。例如:
MATCH (n:Cat) RETURN n.name
UNION
MATCH (n:Dog) RETURN n.name相关文档
- https://newsn.net/say/neo4j-optional-match.html
- https://newsn.net/say/neo4j-match-node.html
- https://newsn.net/say/neo4j-match-relationship.html
- https://neo4j.com/docs/cypher-manual/current/clauses/union/
综述
本文需要注意的是:字段名要一致,不一致就不能union了。如果使用union就会给数据去重,使用union all就不会去重。