2016-10-21 1 views
0

는 두 쿼리를 고려이름 지정 관계가 결과를 변경합니까?

[1] 
MATCH (p1:Person)-[ACTED_IN]->(m1:Movie), (p2:Person)-[DIRECTED]->(m1) 
WHERE p1 = p2 
RETURN p1.name 

[2] 
MATCH (p1:Person)-[xa:ACTED_IN]->(m1:Movie), (p2:Person)-[xd:DIRECTED]->(m1) 
WHERE p1 = p2 
RETURN p1.name 

유일한 차이점은 xa:xd:, 관계 별칭이다.

결과의 차이

훨씬 크다 :

  • 쿼리 1 32 개 행을 갖는다. 모든 사람은 적어도 2 개의 행을 가지고 있으며, 일부는 6을 가지고 있습니다.
  • 쿼리 2에는 3 개의 행이 있습니다. 모두 3 개가 다릅니다.
  • 별칭 1 XOR은 다른 결과를 나타냅니다. 4 또는 10 행입니다.

왜? 집계가 없습니다. 관계 별명은 사용되지 않습니다. 쿼리가 변경되는 이유는 무엇입니까?

데이터베이스가 무료입니다. https://app.graphenedb.com/에 db 'Movie graph'가 있지만 비공개입니다.

답변

2

변수를 관계 유형과 구별하는 구문을 혼합했습니다. 첫 번째 경기에서 : 문자가 없기 때문에 ACTED_INDIRECTED변수이며 모든 관계 유형과 일치하고 일치하는 결과를 던집니다.

:ACTED_IN:DIRECTED은 접두사가 : 인 관계 유형으로 나타내므로 사용하려는 의미입니다.

노드 레이블을 나타내는 :으로 시작하는 토큰과 변수로 사용되는 콜론 앞에있는 토큰 (또는 :이없는 경우 레이블 및 변수가 없습니다. 전체가 변수입니다). 여기

EDIT은 관련 부분을 지적 관계 구문의 몇 가지 예이다 :

이 하나

가 ACTED_IN가 P1과 M1 사이의 모든 관계하는 변수이다. 이 하나

(p1:Person)-[ACTED_IN]->(m1:Movie) 

: ACTED_IN는 P1과 M1 사이의 관계의 형태는, 어떠한 변수가이 하나

(p1:Person)-[:ACTED_IN]->(m1:Movie) 

존재하지 않는다 : ACTED_IN이 P1 및 M1 관계 타입이고 'a'는 일치 된 관계에 바인드 된 변수입니다. :은 관계 타입 역할을 한 후 토큰이되어야하므로

(p1:Person)-[a:ACTED_IN]->(m1:Movie) 

이 하나 잘못된 구문이다.

(p1:Person)-[a:]->(m1:Movie) 
+0

내가 생각하기에 '- [x :] ->'은 ('모든 관계 유형 AS x'에 대해) 유효하지 않은 구문입니다. '모든 관계'에 별명을 지정할 수 있습니까? – Rudie

+0

'- [x :] ->'는':'변수 유형의 앞에 접두사가 있어야하기 때문에 유효하지 않습니다. '- [: x] ->는 'x'유형과 별칭이없는 관계입니다. '- [x] ->'는 타입을 가지지 않으며, 어떤 타입의 관계와도 매치되어 그것들을 'x'의 별칭에 묶을 것입니다. – InverseFalcon

+0

아, 그게 작동하는 방법입니다! 어디서나 구문에 대한 도움말을 찾을 수 없습니다. 'graphdb'또는 'neo4j'또는 'cypher'입니까? – Rudie