【问题标题】:neo4j: type counts by distanceneo4j:类型按距离计数
【发布时间】:2022-01-21 17:04:11
【问题描述】:

我想按类型按与根的距离计算一些计数统计信息。例如,

(A类型:'private')-[value:20]->(B type:'private')-[value:40]->(C type:'private')

(A类型:'private')-[value:0]->(D type:'public')-[value:20]->(E type:'private')

CREATE (:firm {name:'A', type:'private'}), (:firm {name:'B', type:'private'}), (:firm {name:'C', type:'private'}), (:firm {name:'D', type:'public'}), (:firm {name:'E', type:'private'});
MATCH (a:firm {name:'A'}), (b:firm {name:'B'}), (c:firm {name:'C'}), (d:firm {name:'D'}), (e:firm {name:'E'})
CREATE (a)-[:REL {value: 20}]->(b)->[:REL {value: 40}]->(c),
(a)-[:REL {value: 0}]->(d)->[:REL {value: 20}]->(e);

我想得到 A 的每种类型的直接邻居和第 2 层邻居的计数,即,

+-----------------------------+
| distance |   type   | count |
+-----------------------------+
| 0        |  private |   1   |
| 0        |  public  |   0   |
| 1        |  private |   1   |
| 1        |  public  |   1   |
| 2        |  private |   2   |
| 2        |  public  |   0   |
+-----------------------------+

Here 是一个有关按距离聚合统计的相关问题。 谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    为此,apoc library 派上用场了:

    MATCH path=(:firm {name:'A'})-[:REL*]->(leaf:firm)
    WHERE NOT (leaf)-[:REL]->(:firm)
    WITH COLLECT(path) AS paths, max(length(path)) AS longest
    UNWIND RANGE(0,longest) AS depth
    WITH depth,
         apoc.coll.frequencies([node IN apoc.coll.toSet(REDUCE(arr=[], path IN [p IN paths WHERE length(p) >= depth] |
                                       arr
                                       + nodes(path)[depth]
                                ) 
         ) | node.type
         ]) as typesAtDepth
    
    UNWIND typesAtDepth AS typeAtDepth
    RETURN depth, typeAtDepth.item AS type, typeAtDepth.count AS count
    

    对于这个数据集

    CREATE (_174:`firm` { `name`: 'A', `type`: 'type2' }) CREATE (_200:`firm` { `name`: 'D', `type`: 'type2' }) CREATE (_202:`firm` { `name`: 'E', `type`: 'type2' }) CREATE (_203:`firm` { `name`: 'F', `type`: 'type1' }) CREATE (_191:`firm` { `name`: 'B', `type`: 'type1' }) CREATE (_193:`firm` { `name`: 'C', `type`: 'type2' }) CREATE (_174)-[:`REL` { `value`: '0' }]->(_200) CREATE (_200)-[:`REL` { `value`: '20' }]->(_202) CREATE (_202)-[:`REL` { `value`: '99' }]->(_203) CREATE (_174)-[:`REL` { `value`: '20' }]->(_191) CREATE (_191)-[:`REL` { `value`: '40' }]->(_193) 
    

    它返回这个结果:

    ╒═══════╤═══════╤═══════╕
    │"depth"│"type" │"count"│
    ╞═══════╪═══════╪═══════╡
    │0      │"type2"│1      │
    ├───────┼───────┼───────┤
    │1      │"type2"│1      │
    ├───────┼───────┼───────┤
    │1      │"type1"│1      │
    ├───────┼───────┼───────┤
    │2      │"type2"│2      │
    ├───────┼───────┼───────┤
    │3      │"type1"│1      │
    └───────┴───────┴───────┘
    

    【讨论】:

    • 天哪!非常感谢neo4j专家。你是怎么知道这件事的?我在文档中没有看到它。 (顺便说一句,您的产品看起来很棒!)
    • @cccfran 感谢您的客气话。仅供参考,一切都在 Neo4j 文档中。花一些时间浏览 apoc 文档是值得的。您已经使用我们的产品了吗?如果你直接联系我,我可以给你一个旋转。
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2018-07-23
    • 2017-04-08
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多