2014-03-27 6 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

OK ... 나는 해결책 :

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

예, 매우 유용한 google GSON과 같은 JSON 라이브러리를 사용하여 원하는 JSON을 만들 수 있습니다. 이러한 라이브러리 중 일부는 바닐라 데이터 구조를 JSON 객체로 변환하는 데 매우 적합합니다.

java에서 사이퍼 쿼리를 실행하면 ExecutionEngine 개체에서 반환되는 결과는 Map과 호환되는 ExecutionResult 개체입니다. 본질적으로 올바른 종류의 데이터를 반환하도록 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

얍, 감사합니다 ... 즉, 내가 찾은 가장 가까운 솔루션입니다 ...하지만 난이 (지금) 얻을 수없는 발견 이전 수집에서 수집 ... 이 검색어를 사용하고 있습니다 : MATCH (l : 위치) WHERE l.category = '대륙'선택적인 일치 (l) - [: 포함] -> (l2) 선택 사항 일치 (l2) - [: 포함] -> (l3) 선택 일치 (l3) - [: 포함] -> (l4) 복귀 이름 : l.name, 자식 : COLLECT (distinct {name : 어린이 : COLLECT ( 하지만이 오류가 발생합니다 : '오류 : 집계 함수 내에서 집계 함수를 사용할 수 없습니다 (예 : 이름 : l3.name, 자식 : . – frednotet

+0

그리고이 중 하나와 함께, "알 수없는 오류"가 나타납니다. '일치 (l : 위치) 어디에서?category = '대륙' 선택 사항 일치 (l) - [: 포함] - (l2) 선택 사항 일치 (12) - [: 포함] - (l3) WITH l ASI, 12 AS l2, 13 AS l3, COLLECT (DISTINCT l2.name) AS children WITH l AS l, l2 AS l2, l3 AS l3, AS AS 어린이, COLLECT (DISTINCT l3.name) AS children2 RETURN {name : l, children : {name : children, children : {이름 : 어린이 2}}}' – frednotet