neo4j图数据库,如何使用collect函数获得一对多组合结果?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
neo4j
如何处理一对多的情况?如何返回一对多数据?这里的其中一个解决方案就是collect
函数。本文中,苏南大叔还是以neo4j
官方的northwind
数据集为例,说明在neo4j
图数据库中,collect
集合的用法。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述官方northwind
数据集中的collect
函数,比较简单好理解。本文测试环境:win10
,neo4j社区版@4.4.6
,java@11.0.14
。
数据集描述
数据集是官方自带的northwind
数据集,展示的方式是:
:guide northwind-graph
建立这个northwind
数据集的过程及原理,可以参考文章:
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
需求说明
需求是:列出供货商都供应了什么货物,这些货物都存在于哪些商品分类?明显,一个供货商供应了多个商品,这些商品分布在不同的分类中。
标准答案:
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
不使用collect
这种情况下,显然得到了错误的数据返回,仅仅返回了相关分类的第一个分类。
MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.supplierID as sid, c.categoryName as Categories
数据结果错误,得到的分类信息明显不全。
仅仅使用collect
MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.supplierID as sid, collect(c.categoryName) as Categories
这个数据全,但是有冗余数据。
使用collect + distinct【推荐】
MATCH (s:Supplier)-->(:Product)-->(c:Category)
RETURN s.supplierID as sid, collect(distinct c.categoryName) as Categories
事实证明:使用collect
+ distinct
,才是一对多关系结果查询时最正确的选择,可以对冗余数据进行去重操作。
相关文章
- https://newsn.net/say/neo4j-match-node.html
- https://newsn.net/say/neo4j-match-relationship.html
- https://newsn.net/say/neo4j-optional-match.html
综述
更多neo4j
的文章,请点击下面的链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。