2015-01-12 85 views
0

我有一個看起來像這樣的數據集(Artefact) - [HAS] - (關鍵字),關鍵字可以被artefacts多次共享。我試圖達到的是;Neo4j - 獲取類型的所有相關節點並創建新的關係

返回大多數相互關聯的關鍵字節點,與關鍵詞有關的假象的數量,關鍵字節點之間的重疊計數以及到另一個關鍵字(關鍵字) - (artefact) - (關鍵字)的跳數,兩個「共享」關鍵字。

換句話說,在兩個關鍵字節點之間的相交內的人工記錄計數。例如,給定這三個僞影節點

1)(關鍵字; 金屬,食品)

2)(關鍵字; 金屬,戰鬥)

3)(關鍵字; 金屬,食品)

Th因此,e查詢將返回關鍵字節點,與關鍵字(3,勺子,劍和叉)有關的人工製品的計數,關鍵字節點(金屬與食物有2個間接連接,以及與戰鬥有1個)有關的關鍵詞的計數。

一旦我解決了這個問題,爲了提高速度,我意識到這是一個很大的查詢,請在關鍵字之間創建一個related_to關係,並將它們共享的artefact的數量計算在內。只能選擇1個紀錄創造這種關係,以測試它的工作原理:)(因此限制1)

MATCH (n:Keyword)-[r*2]-(x:Keyword) 
WITH n, COUNT(r) AS c, x 
LIMIT 1 
MERGE (n)-[s:RELATED_KEY]-(x) SET s.weight = c 

我使用的Neo4j社區版(2.1.6),

非常感謝,安迪

回答

1

這個查詢將返回你的答案的第一部分:

MATCH (k:Keyword) 
WITH k 
LIMIT 1 
MATCH (k)<-[:HAS]-(a) 
WITH k, collect(a) as artefacts 
WITH k, artefacts, size(artefacts) as c 
UNWIND artefacts as artefact 
MATCH (k)<-[:HAS]-(artefact)-[:HAS]->(k2) 
RETURN c, artefacts, collect(distinct(k2.name)) as keywords, count(distinct(k2.name)) as keyWordsCount 

enter image description here

但是,我猜你可能會直接創建相關節點之間的關係:

MATCH (k:Keyword) 
WITH k 
LIMIT 1 
MATCH (k)<-[:HAS]-(a)-[:HAS]->(other) 
MERGE (k)-[r:RELATED_TO]->(other) 
ON CREATE SET r.weight = 1 
ON MATCH SET r.weight = r.weight + 1 
相關問題