簡體   English   中英

如何通過密碼查詢在neo4j中獲取不同的標簽及其計數?

[英]How to get different labels and their count in neo4j by cypher query?

我需要檢查圖形數據庫 neo4j 中存在哪些不同的標簽。

如何通過密碼查詢在neo4j中獲取不同的標簽及其計數?

我終於找到了一個不那么復雜的多標簽問題的解決方案:

MATCH (a) WITH DISTINCT LABELS(a) AS temp, COUNT(a) AS tempCnt
UNWIND temp AS label
RETURN label, SUM(tempCnt) AS cnt

通過這個密碼查詢,我們可以得到 neo4j 中存在的不同標簽及其計數。

MATCH (n) RETURN DISTINCT LABELS(n), COUNT(n)

獲取每個標簽的計數非常復雜,因為節點可以有多個標簽,而labels (n)返回代表這些標簽的字符串集合。 在由三個節點和兩個標簽組成的圖上,如{:A}{:B}{:A:B}labels (n)返回三個不同的字符串集合。 與使用:A計算兩個節點和使用:B計算兩個節點不同,對於三個標簽組合中的每一個,結果都是一個。 請參閱控制台 要聚合每個標簽,而不是每個標簽集合,您必須按集合中的值進行分組,這很麻煩。

我有一個丑陋的方法來做到這一點,也許有人可以提出更好的方法:首先找出任何節點具有的最大標簽數。

MATCH (n)
RETURN max(length(labels(n)))

然后使用UNION鏈接許多查詢,通過集合中位置i處的標簽計算節點,其中i從 0 開始並遞增到 max-1。 如果節點最多有 3 個標簽,

MATCH (n)
RETURN labels (n)[0] as name, count (n) as cnt
UNION MATCH (n)
RETURN labels (n)[1] as name, count (n) as cnt
UNION MATCH (n)
RETURN labels (n)[2] as name, count (n) as cnt

這將正確聚合標簽計數,但對於索引超出集合邊界的每種情況,它都會返回一個null計數。 對於第一次返回( [0]索引),這表示沒有標簽的節點。 對於其他行,空計數同樣表示標簽少於查詢的節點,但此信息無關緊要,因此可以忽略

MATCH (n)
RETURN labels (n)[0] as name, count (n) as cnt
UNION MATCH (n)
WITH labels (n)[1] as name, count (n) as cnt
WHERE name IS NOT NULL
RETURN name, cnt
UNION MATCH (n)
WITH labels (n)[2] as name, count (n) as cnt
WHERE name IS NOT NULL
RETURN name, cnt

我相信這可以做得更優雅,但就我所知。

您可以利用此處描述的apoc 庫元圖https://stackoverflow.com/a/52489029 --> 運行下面的代碼,即使一個節點附加了更多標簽,它也能工作。

CALL apoc.meta.stats() YIELD labels
RETURN labels

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM