返回 Neo4j 中离开节点的每个边类型的计数

问题描述 投票:0回答:1

给定一个具有多种出站边类型的节点,比如说

["A","B","C"]
类型,我将如何使用 cypher 查询 Neo4j 数据库以返回每个边的计数。

例如如果我有一个类似的图表

(n0:NODE) -[:A]- (n1:NODE)
(n0:NODE) -[:A]- (n2:NODE)
(n0:NODE) -[:B]- (n3:NODE)
(n1:NODE) -[:B]- (n2:NODE)
(n4:NODE) // No edges

假设这些边都是双向的,我希望查询返回

Node, count(A), count(B), count(C) 
n0,   2,        1,        0
n1,   1,        1,        0
n2,   1,        1,        0
n3,   0,        1,        0 
n4,   0,        0,        0

对于所有带有标签

NODE
的节点。

我现在正在使用这个,这没问题,但它将所有不同的边缘类型放在不同的行上,所以我必须在后处理中迭代所有这些边缘类型以构建我想要的表:

MATCH (n:NODE) -[r]- ()
WHERE 
    type(r) in ["A", "B", "C"]
RETURN 
    id(n) as nid,
    type(r) as rtype, 
    count(r) as cnt

有没有办法像我的例子一样将这些全部放在一行中?

neo4j cypher
1个回答
0
投票

有几种方法可以走。由于您想要拥有所有类型的数据,即使它是

0
,因此一种选择是:

MATCH (n:NODE)
OPTIONAL MATCH (n)-[r]-(m:NODE)
WHERE 
    type(r) IN ["A", "B", "C"]
WITH 
    CASE type(r) WHEN 'A' THEN 1 ELSE 0 END AS cA, 
    CASE type(r) WHEN 'B' THEN 1 ELSE 0 END AS cB,
    CASE type(r) WHEN 'C' THEN 1 ELSE 0 END AS cC,
    n.key AS Node
RETURN Node, SUM(cA) AS countA, SUM(cB) AS countB, SUM(cC) AS countC

样本数据:

MERGE (n0:NODE {key:'n0'})
MERGE (n1:NODE {key:'n1'}) 
MERGE (n2:NODE {key:'n2'}) 
MERGE (n3:NODE {key:'n3'}) 
MERGE (n4:NODE {key:'n4'})    

MERGE(n0)-[:A]-(n1)
MERGE(n0)-[:A]-(n2)
MERGE(n0)-[:B]-(n3)
MERGE(n1)-[:B]-(n2)

退货:

╒══════╤════════╤════════╤════════╕
│"Node"│"countA"│"countB"│"countC"│
╞══════╪════════╪════════╪════════╡
│"n0"  │2       │1       │0       │
├──────┼────────┼────────┼────────┤
│"n1"  │1       │1       │0       │
├──────┼────────┼────────┼────────┤
│"n2"  │1       │1       │0       │
├──────┼────────┼────────┼────────┤
│"n3"  │0       │1       │0       │
├──────┼────────┼────────┼────────┤
│"n4"  │0       │0       │0       │
└──────┴────────┴────────┴────────┘

*请注意,您在问题中的方法不会返回“n4”,因为它没有关系,并且您的查询仅匹配具有关系的节点。

© www.soinside.com 2019 - 2024. All rights reserved.