Neo4J是否可以以及如何将所有具有匹配属性值的节点按该值分组?

时间:2019-07-07 01:38:51

标签: neo4j cypher

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

1 个答案:

答案 0 :(得分:1)

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

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

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

通常,如果您还创建了适当的index,则这种查询的执行速度会更快。例如:

CREATE INDEX ON :User(gender);

[更新1]

如果您要查看所有俱乐部成员中的每个女性User,则可以在MEMBER_OF_CLUBUser之间建立Club关系,并修改进行相应查询:

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]

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

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

[UPDATE 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;