2014-01-08 3 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

관련 문제