2017-12-12 8 views
1

Neo4j의 여러 시작 노드 (여러 경로가 될 수 있음)에서 여러 경로 (UI로 그리기)를 쿼리해야하는데 쿼리를 조합하기 위해 UNION을 사용하지만 데이터를 검색하는 것이 가장 효율적인 방법이 아니라고 생각하십시오 (시작 노드에서 인덱스도 사용하고 있습니다). 큰 쿼리를 만들 때 모든 종류의 불쾌한 일이 발생합니다.Neo4j Cypher : UNION으로 매우 큰 쿼리 만들기

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name=’john doe1' AND (g:acted_in OR g:produced) 
AND p.addDate >= '2017-12-10T00:00:00+00:00' 
AND p.addDate <= '2017-12-12T08:08:06+00:00' 
AND l.addDate >= '2017-12-10T00:00:00+00:00' 
AND l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000 

UNION 

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name=’john doe2' AND (g:acted_in OR g:produced) 
AND p.addDate >= '2017-12-10T00:00:00+00:00' 
AND p.addDate <= '2017-12-12T08:08:06+00:00' 
AND l.addDate >= '2017-12-10T00:00:00+00:00' 
AND l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000 

UNION 

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name=’john doe3' AND (g:acted_in OR g:produced) 
AND p.addDate >= '2017-12-10T00:00:00+00:00' 
AND p.addDate <= '2017-12-12T08:08:06+00:00' 
AND l.addDate >= '2017-12-10T00:00:00+00:00' 
AND l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000 

이 만 3 경로와 쿼리이며, 수백 잘 확장되지 않습니다

쿼리는 다음과 같이 보인다. 이 작업을 수행하는 간단하고 효율적인 방법이 있습니까?

+0

이름 만 변경한다고 가정 할 때 경로를 결합하지 말고 왜 그렇지 않습니까? 또한 PROFILE을 (를) 쿼리에 사용 했습니까? 궁극적 인 병목 현상을 발견하기 위해 –

+0

또는 여전히 큰 쿼리를 작성할 것입니다. 짧은 쿼리를 생성 할 때 @Bruno Peres가 솔루션을 표시했습니다. 감사! – Yuval

답변

1

n.name 비교 만 변경 중이므로 IN operator을 사용하여 쿼리를 다시 쓰고 이름 목록을 배열로 전달할 수 있습니다. 이 방법 :

MATCH path = ((n:actor)-[*0..2]->(g)-[p:was_filmed_at]->(k:movie_set)-[l:located]->(i:state)) 
WHERE n.name IN ['john doe1', 'john doe2', 'john doe3'] 
AND (g:acted_in OR g:produced) 
AND '2017-12-10T00:00:00+00:00' <= p.addDate <= '2017-12-12T08:08:06+00:00' 
AND '2017-12-10T00:00:00+00:00' <= l.addDate <= '2017-12-12T08:08:06+00:00' 
RETURN nodes(path), relationships(path) 
LIMIT 1000 

또한 수와 같은 체인 불평등 : AND '2017-12-10T00:00:00+00:00' <= p.addDate <= '2017-12-12T08:08:06+00:00'은. 시작 노드의 빠른 색인 조회를 위해 an index:actor(name)에 있는지 확인하십시오. (Thanks to @InverseFalcon)

+2

또한 다음과 같은 부등식을 연결할 수 있습니다. 'AND'2017-12-10T00 : 00 : 00 + 00 : 00 '<= p.addDate <='2017-12-12T08 : 08 : 06 + 00 : 00'' – InverseFalcon

+2

또한 시작 노드의 빠른 인덱스 조회를위한 액터 (이름)에 대한 인덱스가 있는지 확인하십시오. – InverseFalcon

+0

@InverseFalcon Right! 나는 대답을 업데이트했다! 기여 해줘서 고마워! –