2014-03-07 53 views
1

使用neo4j社區版本2.x.在Cypher中,我需要以兩種不同的方式來匹配MATCH節點,然後將這些(兩個)匹配節點集合成單個集合(一個變量名稱)。這一套將用於進一步的行動。將來自更多MATCH的節點組合成單個變量

naive graph example(我不能發表圖片)

我想找到松鼠的所有知識,包括由組她的成員共享知識。 (例子是虛構的)

我想是這樣的:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group) 
WITH "COMBINATION OF u AND g" AS ug 
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type 

成果既要「破解堅果」和「逃避天敵」。

代替「u與g的組合」,我嘗試了collect(u)+ collect(g),EXTRACT等的變體。沒有成功。

到目前爲止,我發現最簡單的工作方式是使用UNION。

MATCH (u:User{username:'squirrel'})-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type 
UNION 
MATCH (u:User{username:'squirrel'})<-[:MEMBER]-(:Group)-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type 

這可能會解決這個簡單的例子,但不適合更復雜的查詢。我尋求解決更一般問題的方法:匹配幾組節點,將它們粘合成單個集合(單個變量)並繼續使用這個新集合。

有什麼想法嗎?我缺少一些基本的東西嗎?或者這是不可能的?謝謝!

grokbase上可能類似的東西。

編輯:

隨着this hacky solution to similar question我是能夠解決由節點的集合提取內部ID的問題:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group) 
WITH [x in collect(u)+collect(g)|id(x)] as collectedIds MATCH (ug) WHERE id(ug) in collectedIds 
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type 

能不能做到更好嗎?

回答

1

唯一的通用的解決方案,我發現迄今:

  • 匹配所需的起始點(以不同的名稱)
  • 收集內部的id開始點的
  • 匹配的開始點與收集的IDS(無W上的出發點有單名)
  • 你需要,起點做

現在的代碼本身的任何行動:

MATCH (u:User{username:'squirrel'}), (:User{username:'squirrel'})<-[:MEMBER]-(g:Group) 
WITH [x in collect(u)+collect(g)|id(x)] as collectedIds MATCH (ug) WHERE id(ug) in collectedIds 
MATCH (ug)-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type 
1

不知道的一般情況,但對於這種特殊情況下,你可以嘗試在兩種模式如下合併成一個,

MATCH (u:User{username:'squirrel'})<-[:MEMBER*0..1]-()-[:KNOW_HOW]->(k:Knowledge) 
RETURN k.type 
相關問題