我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

neo4j如何处理一对多的情况?如何返回一对多数据?这里的其中一个解决方案就是collect函数。本文中,苏南大叔还是以neo4j官方的northwind数据集为例,说明在neo4j图数据库中,collect集合的用法。

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - neo4j-collect-hero
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-1)

大家好,这里是苏南大叔的平行空间笔记本博客,这里记录苏南大叔和计算机代码的故事。本文描述官方northwind数据集中的collect函数,比较简单好理解。本文测试环境:win10neo4j社区版@4.4.6java@11.0.14

数据集描述

数据集是官方自带的northwind数据集,展示的方式是:

:guide northwind-graph

建立这个northwind数据集的过程及原理,可以参考文章:

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - northwind-guide
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-2)

LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/products.csv" AS row
CREATE (n:Product)
SET n = row,
n.unitPrice = toFloat(row.unitPrice),
n.unitsInStock = toInteger(row.unitsInStock), n.unitsOnOrder = toInteger(row.unitsOnOrder),
n.reorderLevel = toInteger(row.reorderLevel), n.discontinued = (row.discontinued <> "0")
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/categories.csv" AS row
CREATE (n:Category)
SET n = row
LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/suppliers.csv" AS row
CREATE (n:Supplier)
SET n = row

建立数据集关系

产品属于某个分类,某个分类可以有多个产品。

MATCH (p:Product),(c:Category)
WHERE p.categoryID = c.categoryID
CREATE (p)-[:PART_OF]->(c)

产品由某个供货商供货,一个供货商可以供应多个产品。

MATCH (p:Product),(s:Supplier)
WHERE p.supplierID = s.supplierID
CREATE (s)-[:SUPPLIES]->(p)

关系预览:

call db.schema.visualization

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - 节点之间的关系演示
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-3)

需求说明

需求是:列出供货商都供应了什么货物,这些货物都存在于哪些商品分类?明显,一个供货商供应了多个商品,这些商品分布在不同的分类中。

标准答案:

MATCH (s:Supplier)-->(p:Product)-->(c:Category)
RETURN s.companyName as Company,s.supplierID as sid, 
collect(distinct p.productName) as Products,
collect(distinct c.categoryName) as Categories

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - 标准答案
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-4)

不使用collect

这种情况下,显然得到了错误的数据返回,仅仅返回了相关分类的第一个分类。

MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.supplierID as sid, c.categoryName as Categories

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - collect语句0
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-5)

数据结果错误,得到的分类信息明显不全。

仅仅使用collect

MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.supplierID as sid, collect(c.categoryName) as Categories

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - collect语句1
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-6)

这个数据全,但是有冗余数据。

使用collect + distinct【推荐】

MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.supplierID as sid, collect(distinct c.categoryName) as Categories

苏南大叔:neo4j图数据库,如何使用collect函数获得一对多组合结果? - collect语句2
neo4j图数据库,如何使用collect函数获得一对多组合结果?(图7-7)

事实证明:使用collect + distinct,才是一对多关系结果查询时最正确的选择,可以对冗余数据进行去重操作。

相关文章

综述

更多neo4j的文章,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   neo4j    cypher