首页 > 解决方案 > Neo4J 是否有可能以及如何通过该值对具有匹配属性值的所有节点进行分组?

问题描述

假设我们有一个小型的面向文档的数据库(如 ElasticSearch),我们从中创建了 Neo4j 数据库内容。每个文档都是关于描述其各种属性(性别、银行、部门、年龄、职位)的用户...我想可视化 Neo4J 中的所有条目,按相同的属性值对用户进行分组(连接)。因此,所有“女性”用户以及所有“腐蚀”部门官员都将被连接。是否有可能以及如何通过这些值对具有匹配属性值的所有节点进行分组?

标签: neo4jcypher

解决方案


要可视化所有Female节点,只需在 neo4j 浏览器中运行:

MATCH (n:User)
WHERE n.gender = 'Female'
RETURN n;

无需将所有Female节点冗余连接在一起。

一般来说,如果您还创建了适当的索引,这种查询会执行得更快。例如:

CREATE INDEX ON :User(gender);

[更新 1]

如果您想查看User所有俱乐部成员的每个女性,那么您可以在s 和sMEMBER_OF_CLUB之间建立关系并相应地修改查询:UserClub

MATCH (c:Club)
WITH COUNT(c) AS clubCount
MATCH (n:User)
WHERE n.gender = 'Female' AND SIZE((n)-[:MEMBER_OF_CLUB]->()) = clubCount
RETURN n;

此查询使用有效的度数运算来检查User所属俱乐部的数量是否等于俱乐部的总数。

[更新 2]

要查看每个俱乐部的所有女性成员(有任何女性成员),只需使用聚合函数 COLLECT

MATCH (n:User)-[:MEMBER_OF_CLUB]->(club:Club)
WHERE n.gender = 'Female'
RETURN club, COLLECT(n) AS female_members;

[更新 3]

如果您真的希望每个User节点都保留一个俱乐部名称列表(而不是拥有Club节点和MEMBER_OF_CLUB关系),这应该有效:

MATCH (n:User)
WHERE n.gender = 'Female'
UNWIND n.clubs AS club
RETURN club, COLLECT(n) AS female_members;

推荐阅读