Neo4j 如何在可变长度关系的每个深度聚合节点数 数据结构
我的图形中有用户和组织节点存储在neo4j中 用户可以引用另一个用户关系:REFFERED 用户可以订阅组织关系:SUBSCRIBED\u to 球门 我想查找来自一个用户的推荐,例如friends-of-friends-of-n*/referral-of-referral-of-n*以及这些用户所做的订阅,按深度级别排序 问题 我有以下问题: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 *,
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
深度、类型和计数应具有预期值。端点将是具有相同深度和类型值的端点节点的集合 分组键就是我要找的!我觉得好像有一些隐含的分组在进行,但我不能把我的手指放在上面。一定读过了,谢谢!