Neo4j 如何在可变长度关系的每个深度聚合节点数 数据结构

Neo4j 如何在可变长度关系的每个深度聚合节点数 数据结构,neo4j,cypher,Neo4j,Cypher,我的图形中有用户和组织节点存储在neo4j中 用户可以引用另一个用户关系:REFFERED 用户可以订阅组织关系:SUBSCRIBED\u to 球门 我想查找来自一个用户的推荐,例如friends-of-friends-of-n*/referral-of-referral-of-n*以及这些用户所做的订阅,按深度级别排序 问题 我有以下问题: MATCH p= (start:User {uid: 1})-[:REFERRED|SUBSCRIBED_TO*]->(end) WITH *,

我的图形中有用户和组织节点存储在neo4j中

用户可以引用另一个用户关系:REFFERED 用户可以订阅组织关系:SUBSCRIBED\u to

球门 我想查找来自一个用户的推荐,例如friends-of-friends-of-n*/referral-of-referral-of-n*以及这些用户所做的订阅,按深度级别排序

问题 我有以下问题:

MATCH p= (start:User {uid: 1})-[:REFERRED|SUBSCRIBED_TO*]->(end)
WITH *, relationships(p) as rel
WITH *, size(rel) as Depth
WITH Depth, type(rel[Depth - 1]) as Type, count(p) as Count
RETURN Depth, Type, Count
返回:

╒═══════╤══════════════════════╤═══════╕
│"Depth"│"Type"                │"Count"│
╞═══════╪══════════════════════╪═══════╡
│1      │"REFERRED"            │10     │
├───────┼──────────────────────┼───────┤
│2      │"REFERRED"            │100    │
├───────┼──────────────────────┼───────┤
│3      │"REFERRED"            │1000   │
├───────┼──────────────────────┼───────┤
│4      │"REFERRED"            │10000  │
├───────┼──────────────────────┼───────┤
│4      │"SUBSCRIBED_TO"       │6      │
├───────┼──────────────────────┼───────┤
│2      │"SUBSCRIBED_TO"       │2      │
└───────┴──────────────────────┴───────┘
结果是正确的。但是,如果我想将end in传递给,以便使用并集将第二个结果与end值匹配,则结果集会发生更改

查询:

MATCH p= (start:User {uid: 1})-[:REFERRED|SUBSCRIBED_TO*]->(end)
WITH *, relationships(p) as rel
WITH *, size(rel) as Depth
WITH Depth, type(rel[Depth - 1]) as Type, count(p) as Count, end
RETURN Depth, Type, Count
结果:

╒═══════╤══════════════════════╤═══════╕
│"Depth"│"Type"                │"Count"│
╞═══════╪══════════════════════╪═══════╡
│1      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤
│2      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤
│3      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤
│4      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤
│4      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤
│4      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤
│4      │"REFERRED"            │1      │
├───────┼──────────────────────┼───────┤

...
├───────┼──────────────────────┼───────┤
│4      │"SUBSCRIBED_TO"       │2      │
├───────┼──────────────────────┼───────┤
│4      │"SUBSCRIBED_TO"       │2      │
├───────┼──────────────────────┼───────┤
│4      │"SUBSCRIBED_TO"       │1      │
├───────┼──────────────────────┼───────┤
│4      │"SUBSCRIBED_TO"       │1      │
...
问题 因此,我的问题分为两部分:

如何用cypher最有效地构造这种查询? 什么样的范式或密码原理使得当end被传递时,结果分布在多行上 与COLLECT类似,使用同一WITH或RETURN子句中的非聚合项作为分组键。您应该阅读文档以了解更多详细信息

下面是一个可能适合您的用例的查询:

MATCH p = (:User {uid: 1})-[:REFERRED|SUBSCRIBED_TO*]->(end)
WITH
  LENGTH(p) AS depth,
  TYPE(LAST(RELATIONSHIPS(p))) AS type,
  COLLECT(end) as ends
RETURN depth, type, SIZE(ends) AS count, ends
深度、类型和计数应具有预期值。端点将是具有相同深度和类型值的端点节点的集合

分组键就是我要找的!我觉得好像有一些隐含的分组在进行,但我不能把我的手指放在上面。一定读过了,谢谢!