2014-04-01 4 views
1

충분히 좋은 제목을 찾을 수 없었습니다. 이것은 어려울 것입니다. 그러나 최선을 다해 제 상황을 설명하려고 노력할 것입니다.복수 (다른) 열이있는 하위 쿼리를 사용하는 방법

저는 저에게 유일한 해결책은 두 번째 쿼리에서 일치를 시작하는 데 첫 번째 쿼리의 결과가 사용되는 두 개의 개별적인 사이퍼 쿼리를 사용하는 것으로 보이는 문제가 발생했습니다. 끝난. 내가 시도한만큼 WITH 나 UNION 절이 나에게 원하는 결과를 줄 수 없기 때문에 내 문제가 고유하다고 느낀다.

내가하려는 것은 다음과 같습니다.

MATCH (n1)--(n2) WHERE n2.name="something" WITH n2 
MATCH (n2)--(n3) WHERE n3.name="something_else" WITH n3 as to_be_returned, n3 as to_continue 
MATCH (to_continue)--(n4) WHERE n4.name="something" 
RETURN to_be_returned as FirstPartResults, n4 as SecondPartResults 

내가이에 내가 처음 두 경기의 끝 부분에 도착하면, 나는 Neo4j 정보 (N3)의 별도의 조각으로 일치했다대로 유지하고자 여기에하려고 노력하고 있어요 같은 시간에 계속 진행하고 더 많은 일치를 만들어 n4까지 줄이면 n3과 n4가 모두 반환됩니다. 그러나 Neo4j가하는 일은 n4에 대한 정확한 결과를 제공하지만 n3의 결과는 항상 n4와 동일합니다. 즉, "to_be_returned"로 얽혀 있습니다. 반면에 "to_continue" "to_be_returned"만 남겨 둡니다.

하나의 쿼리에서이 작업을 수행하려는 이유는 두 개의 개별 쿼리로 나누면 페이지 매김 문제를 피하려고하기 때문입니다.

내가 모든 다음 사용 UNION을 시도했다 :

MATCH (n1)--(n2) WHERE n2.name="something" WITH n2 
MATCH (n2)--(n3) WHERE n3.name="something_else" 
RETURN n3.name as "to_be_returned" 

UNION ALL 

MATCH (n1)--(n2) WHERE n2.name="something" WITH n2 
MATCH (n2)--(n3) WHERE n3.name="something_else" WITH n3 
MATCH (n3)--(n4) WHERE n4.name="something" 
RETURN n4 as SecondPartResults 

이 나에게 다음과 같은 오류 제공 :

All sub queries in an UNION must have the same column names 

동일하게 열 이름을 변경을, 정확히 같은 결과를 얻을 수 있습니다 UNION을 사용하지 않고 원래 쿼리.

어떤 이유로 편집

, 나는 그냥 MATCH 쿼리와 함께 여기 CREATE 문을 붙여 때문에 병, 콘솔 URL을 만들고 공유 할 수 없습니다입니다.

create 
(_6:Crew {name:"Neo"}), 
(_7:Crew {name:"Morpheus"}), 
(_8:Crew {name:"Trinity"}), 
(_9:Crew:Matrix {name:"Cypher"}), 
(_10:Matrix {name:"Agent Smith"}), 
(_11:Matrix {name:"The Architect"}), 
(_12:USER {name:"Sherlock Holmes"}), 
(_13:USER {name:"John Watson"}), 
_6-[:KNOWS]->_7, 
_6-[:LOVES]->_8, 
_6-[:FRIENDS]->_13, 
_7-[:KNOWS]->_8, 
_7-[:KNOWS]->_9, 
_8-[:FRIENDS]->_12, 
_9-[:KNOWS]->_10, 
_10-[:CODED_BY]->_11 

MATCH (c1:Crew) WHERE c1.name="Morpheus" WITH c1 MATCH (c1)--(c2:Crew) WITH c2 AS to_be_returned, c2 AS to_continueMATCH (to_continue)--(u:USER) WHERE u.name="Sherlock Holmes" RETURN to_be_returned AS FirstPart, to_continue AS SecondPart; 

첫 번째 결과와 두 번째 파트 결과가 모두 동일하게 나옵니다. 첫 번째 부분에는 결과 트리니티와 네오가 포함되어야하며 두 번째 부분에는 트리니티가 있어야합니다.

+1

"to_continue"별명의 원래 C2에 맞게 계속 일치 (C2)를 수집하고 "to_be_returned"로 컬렉션을 할당 할 수있는 것은 HTTP (A [콘솔 예]입니다 : //neo4j-console-20.herokuapp.com/r/vz6mg6), 비슷한 것을 할 수 있고 쿼리에서 반환 할 데이터를 설명 할 수 있습니까? '선택적인 일치'문제입니까? 즉 '두 번째 부분'이 일치하지 않을 수 있습니다. 아니면 "그걸로 망쳤다"는게 무슨 뜻이야? – jjaderberg

+0

좀 더 구체적인 예가 있습니까? collect를 사용하면 구문의 카디널리티를 변경하지 않고 컬렉션에 특정 정보를 넣을 수 있습니다. 당신의 모든 성명서를 하나로 통합하는 것은 어떨까요? 또는 이름을 선행하여 노드를 검색 한 다음 (선택 사항) 일치를 수행합니까? –

+0

샘플 데이터 세트와 잘못된 결과를주는 샘플 쿼리로 질문을 편집했습니다. 이제는 더 명확 해지기를 바랍니다. @jjaderberg 필자는 선택적 매치 문제라고 생각하지 않습니다. Michael Hunger 수집 (to_be_resturned)을 사용해 보았지만 동일한 문제가 발생합니다. 나는 당신의 다른 제안을 시도하지 않았지만, 나는 나의 편집이 질의를 더 명확하게 할 수 있기를 바랬다. Btw, 답변 해 주셔서 감사드립니다. 고맙습니다 !! – arijeet

답변

3

당신은 먼저 추가하는 대신 다음

MATCH (c1:Crew) WHERE c1.name='Morpheus' 
WITH c1 
MATCH (c1)--(c2:Crew) 
WITH collect(c2) AS to_be_returned 
MATCH (c2)--(u:USER) 
WHERE u.name='Sherlock Holmes' 
RETURN to_be_returned AS FirstPart, collect(c2) AS SecondPart 
+0

답변 해 주셔서 감사합니다! 첫째로 작동합니다! 그러나 약간의 문제가 있습니다. 그것의 끝에서 결과를 페이지 매기기 (예 : SKIP 및 LIMIT) 할 수 있기를 원합니다. SKIP, LIMIT 옵션은 컬렉션에 사용할 수 없다는 것을 이해했습니다. 그렇다면 제한된 결과에 대해 쿼리의 두 번째 부분을 실행하기 위해 제한된 수만큼 되돌릴 수있는 방법이 있습니까? – arijeet

+0

Ive는 페이지 매김 문제를 해결할 수있었습니다. 귀하의 답변은 완벽하게 작동합니다! 감사! 내가 작성한 실수는 'WITH collect (c2)'와 함께 있었고 나는 또한 'c2'를 따로 이월했습니다. 감사합니다 Lisa, jjaderberg 및 Michael !! – arijeet

관련 문제