2014-03-27 69 views
1

我目前正在開發一個新的應用程序,我需要管理位置(大洲>國家>地區>城市)。解析樹結果/得到兒童

我從Neo4j的使用暗號嘗試(沒有成功),以獲得一棵樹直接:

MATCH p = (r:Location)-[:CONTAINS*]->() 
WHERE r.category='continent' 
RETURN p AS path 

現在,我想分析這些DATAS,這樣我就可以做到這一點的方法:

MATCH (r:Location)-[:CONTAINS]->(r2) 
WHERE r.category='continent' 
OPTIONAL MATCH (r2)-[:CONTAINS]->(r3) 
OPTIONAL MATCH (r3)-[:CONTAINS]->(r4) 
OPTIONAL MATCH (r4)-[:CONTAINS]->(r5) 
OPTIONAL MATCH (r6)-[:CONTAINS]->(r6) 
RETURN r.name, r.category, r2.name, r2.category, r3.name, r3.category, r4.name,r4.category, r5.name, r5.category, r6.name, r6.category 

但這不是我等待的迴應,我不喜歡這個解決方案,因爲最多有6個關係。如果我這樣做,我冒險破壞樹。

[ { 'r.name': 'Europe','r.category': 'continent','r2.name': 'Germany','r2.category': 'country','r3.name': null,'r3.category': null,'r4.name': null,'r4.category': null,'r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null }, 
    { 'r.name': 'Europe','r.category': 'continent','r2.name': 'France','r2.category': 'country','r3.name': 'Ile de France','r3.category': 'region','r4.name': 'Paris','r4.category': 'city','r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null }, 
    { 'r.name': 'Europe','r.category': 'continent','r2.name': 'France','r2.category': 'country','r3.name': 'Ile de France','r3.category': 'region','r4.name': 'Versailles','r4.category': 'city','r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null }, 
    { 'r.name': 'Europe','r.category': 'continent','r2.name': 'France','r2.category': 'country','r3.name': 'Ile de France','r3.category': 'region','r4.name': 'Montreuil','r4.category': 'city','r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null }, 
    { 'r.name': 'Europe','r.category': 'continent','r2.name': 'Belgium','r2.category': 'country','r3.name': null,'r3.category': null,'r4.name': null,'r4.category': null,'r5.name': null,'r5.category': null,'r6.name': null,'r6.category': null } ] 

有沒有一種方法來分析結果/改變我的查詢以獲得一個JSON格式與「兒童」樹的那樣:

[{"name":"Africa"},{"name":"Europe","childrens":[{"name":"France"},{"name":"Germany"},{"name":"Belgium","childrens":[{"name":"Brussels Capitale","childrens":[{"name":"Brussels Capitale"}]}]}]}] 

感謝您的幫助!

Fred。

回答

1

行...我找到了解決辦法:)

MATCH (l:Location) WHERE l.category='continent' 
OPTIONAL MATCH (l)-[:CONTAINS]->(l2:Location) 
OPTIONAL MATCH (l2)-[:CONTAINS]->(l3:Location) 
OPTIONAL MATCH (l3)-[:CONTAINS]->(l4:Location) 
OPTIONAL MATCH (l4)-[:CONTAINS]->(l5:Location) 
WITH l AS l, l2 AS l2, l3 AS l3, l4 AS l4, COLLECT(DISTINCT { name: l5.name }) AS subl4 
WITH l AS l, l2 AS l2, l3 AS l3, subl4, COLLECT(DISTINCT { name: l4.name, children: subl4 }) AS subl3 
WITH l AS l, l2 AS l2, subl3 AS subl3, COLLECT(DISTINCT { name: l3.name, children: subl3 }) AS subl2 
WITH l AS l, COLLECT(DISTINCT { name: l2.name, children: subl2 }) AS subl 
RETURN COLLECT(DISTINCT { name: l.name, children: subl }) 
1

是的,你可以使用JSON庫,如非常好的google GSON來創建你想要的JSON。其中一些庫非常善於使用vanilla數據結構,並將它們轉換爲JSON對象。

因此,當您在java中執行密碼查詢時,從ExecutionEngine對象中取回的結果是一個ExecutionResult對象 - 與Map類型兼容。從本質上講,如果您使用Cypher查詢來返回正確的數據,則可以將執行結果直接輸入GSON。如何使用GSON將複雜的Java對象轉換爲JSON is here的示例。

您的另一種選擇是使用Neo4J REST API通過POST操作將您的Cypher查詢發佈到服務器,然後嘗試按摩它發回給您的JSON。我不認爲它會將您想要的完全發送給您,但您可以非常接近,然後從那裏使用該格式。

1

使用Neo4j 2.0,您還可以在Cypher中使用文字地圖和集合,因此您可以根據自己的喜好構建自己的JSON文檔,以此GraphGist爲例。

http://gist.neo4j.org/?9269173

+0

邑,謝謝......這是最接近的解決方案,我發現......但我不能(現在)得到(l:Location)WHERE l.category ='continent'OPTIONAL MATCH(l) - [:CONTAINS] - >(l2)我們使用此查詢: 'MATCH可選匹配(l2) - [:CONTAINS] - >(l3)可選匹配(l3) - [:CONTAINS] - >(l4)RETURN {name:l.name,children:COLLECT(distinct {name:l2.name,兒童:COLLECT(不同的{name:l3.name,children:COLLECT(distinct {name:l4.name})})})}' 但是我得到這個錯誤: 錯誤:不能使用集合函數。' – frednotet

+0

和這一個,我得到一個「未知的錯誤」: '匹配(l:位置)哪裏l。(l2) - [:CONTAINS] - (l3) WITH L AS l,l2 AS l2,l3 AS l3,COLLECT(l3) OPTIONAL MATCH(l) - [:CONTAINS] - (l2) (DISTINCT l2.name)AS children WITH l AS l,l2 AS l2,l3 AS l3,children AS children,COLLECT(DISTINCT l3.name)AS children2 RETURN {name:l,children:{name:children,children :{name:children2}}}' – frednotet