给定一个具有多种出站边类型的节点,比如说
["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
有没有办法像我的例子一样将这些全部放在一行中?
有几种方法可以走。由于您想要拥有所有类型的数据,即使它是
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”,因为它没有关系,并且您的查询仅匹配具有关系的节点。