2014-01-08 23 views
1

在我的Neo4j 2.0服務器數據庫中我有一個森林,即一組樹。我的一個用例是獲取任意子樹節點的子節點。Cypher:一個調用中的多個獨立查詢

舉例來說,我有根節點

root1 root2 root3 root4 

,現在我想的root1root4子節點。 我需要知道哪些孩子屬於哪個根。每個查詢都是一個簡單的MATCH Cypher查詢。但爲了提高性能,我希望保持數據庫調用的數量低,因爲我使用Neo4j服務器。因此,我正在想辦法告訴Cypher「給我root1和root4的子項並告訴我哪個節點屬於結果中的哪個根」。那就是,我想到了一種地圖。或者一組結果集合,其中第一個元素是第一個根節點的子節點,第二個元素是第二個根節點的子節點等。

有沒有辦法在Cypher中執行此操作,否則我將不得不掉落回到服務器插件在這裏?

謝謝,最好的問候!

編輯:

澄清:我主要擔心的是,我需要知道哪些孩子屬於哪個根。作爲一個例子,考慮此命令生成小圖:

create (r1:ROOT {name:"root1"}), 
(r2:ROOT {name:"root2"}), 
(c11:CHILD {name:"child1_1"}), 
(c12:CHILD {name:"child1_2"}), 
(c13:CHILD {name:"child1_3"}), 
(c21:CHILD {name:"child2_1"}), 
(c22:CHILD {name:"child2_2"}), 
(c23:CHILD {name:"child2_3"}), 
(r1)-[:HAS_CHILD]->(c11), 
(r1)-[:HAS_CHILD]->(c12), 
(r1)-[:HAS_CHILD]->(c13), 
(r2)-[:HAS_CHILD]->(c21), 
(r2)-[:HAS_CHILD]->(c22), 
(r2)-[:HAS_CHILD]->(c23) 

在這裏,我們分別得到root1root2,有三個孩子。

要獲得root1孩子我會發出以下查詢:

MATCH (r:ROOT)-[:HAS_CHILD]->c where r.name='root1' RETURN collect(c) 

現在我知道根root1的孩子。 現在的問題是:如果查詢看起來像查詢root1root2的孩子,其結果將顯示哪個孩子屬於哪個根的關聯。因爲很清楚查詢

MATCH (r:ROOT)-[:HAS_CHILD]->c where r.name='root1' OR r.name='root2' RETURN collect(c.id) 

會給我兩個孩子的根。但是現在我不知道哪根有哪個孩子。那麼我能做什麼?

+0

這不應該是一個問題,什麼是查詢一棵樹看起來像?如果您通過屬性值查找單個根,則可以修改它以通過值集合查找許多根。 – jjaderberg

+1

是的,給我們更多的細節,我們可以建立你的查詢。 –

+0

非常感謝您的意見。請接受我對不太詳盡的問題描述的道歉,我希望現在更清楚。 – khituras

回答

0

你應該給我們更多的細節,但這樣的查詢(調整屬性和關係),應該工作,只要你想:

MATCH (child) <-[:HAS_CHILD]- (root:ROOT) 
WHERE root.name IN ['root1','root4'] 
RETURN child, root 
+0

你是對的,我編輯了我的文章,希望現在有足夠的信息。關於你提出的問題:現在我會擁有所有的孩子,但我不知道哪個孩子屬於哪個根。 – khituras

+0

我更新了我的答案,以包含孩子的根在回報 – onof

+1

哦,我的,這很容易。非常感謝你,我幾乎覺得我不得不爲這個顯而易見的問題道歉。最後,我可能會用MATCH(r:ROOT) - [:HAS_CHILD] - > c WHERE r.name ='root1'或r.name ='root2'return collect(c),r;因爲那樣我甚至可以讓孩子們按照各自的根節點進行分組。再次感謝! – khituras

相關問題