2016-10-24 3 views
0

나는이 사이퍼 쿼리를 가지고 : 13 개 Email 노드와 10 개 Phone 노드 그러나 : 나는 결과가 노드를 반환 할 때Neo4j의 속성을 반환하면 예기치 않은 결과가 발생하는 이유는 무엇입니까?

match (c:Person) 
match (c)-[:eml]->(emls:Email) 
match (c)-[:phn]->(phns:Phone) 
return phns.Number, emls.Value 

Email의 노드는 Phone 노드 (10)

이며, 13 나는 재산을 돌려 보낸다 : phones.Number, 나는 130 개의 중복 된 결과를 얻는다. (그 숫자는 13 * 10에서왔다.)

+0

문제는 완전히 명확하지 않습니다. 첫째, 당신은 당신의 그래프에 한명의 사람이 있습니까? 둘째, 결과의 수를 어디에서 계산합니까? 시각화보기 ("그래프")는 "중복"을 제거하지만 표 ("행")로 이동하면 볼 수 있습니다. 여기 간단한 예제를 만들었습니다. https://gist.github.com/szarnyasg/62229f46e81b4a2dd58a5ea26017e561 - 필요에 맞게 조정하여 질문에 추가하십시오. –

+0

귀하의 의견에 많은 감사드립니다. 데이터베이스에 여러 개의 '사람이 있습니다. 내가 목적을 테스트하기 위해 그 노드의 숫자를 입력했기 때문에 나는 카운트를 알고있다 –

답변

4

새로운 패턴과 일치하여 결과 그래프를 확장 할 때마다, 당신은 새로운 결과와 이전 결과 카티 제품을 수행

  1. 당신은 그런 다음 한 사람이 X이
  2. 한 사람이 (13) 이메일, 즉 13 (사람, 이메일)는
  3. 당신은 다음 1 명 X 13 이메일 × 10 전화, 즉 130 (사람, 이메일, 전화) 당신은 각 단계에서 수집해야

을 튜플이 튜플 avo 제품 ID : 1 인당 결과 행을 유지하거나 전자 메일과 전화가 모두 콜렉션 인 1 (사람, 전자 메일, 전화) 튜플.

MATCH (c:Person) 
OPTIONAL MATCH (c)-[:eml]->(emls:Email) 
WITH c, collect(emls.Value) AS emails 
OPTIONAL MATCH (c)-[:phn]->(phns:Phone) 
RETURN c, emails, collect(phns.Number) AS phones 
+0

당신의 대답에 감사드립니다. 문제는 .As (Of T) 메서드를 사용할 때 검색된 결과를 Neo4jsCliemt에서 읽을 수 없으므로 collect 함수를 사용할 수 없다는 것입니다. 어쨌든 우리가이 문제를 되돌릴 수 있습니까? –

+1

조합 수만큼 많은 결과 행을 가지지 않는 유일한 방법은'collect()'를 사용하는 것입니다. 클라이언트가 문자열이나 숫자 모음을 열로 읽을 수없는 방법, 특히 Neo4j 클라이언트를 상상해보십시오. 내 말은, 단일 노드 프로퍼티는 이미'collect()'에 의지하지 않고 콜렉션을 포함 할 수 있기 때문에 이들을 읽을 수 없다는 것은 꽤 제한적이라는 것을 의미한다. –

+0

시도해보십시오. 많은 도움에 감사드립니다. –

관련 문제