2014-10-06 2 views
0

그래서 15 개의 실제 비즈니스 개체를 나타내는 Neo4j의 15 가지 레이블이 있습니다. 이 모든 객체들은 서로 관련되어 있습니다. 각 객체 (레이블)에는 수천 개의 노드가 있습니다. 내가하려는 것은 이러한 모든 레이블 사이에서 선택적인 일치를 수행하고 관련 데이터를 얻는 것입니다. 쿼리가 매우 느리게 실행되어 15 개가 모두 선택되었으며 3-4 개 개체 유형에서 제대로 작동합니다.Neo4j 쿼리 최적화 - 15 diff 레이블

일반적으로이 쿼리는 제대로 작동하는 개체 유형이 적은 쿼리입니다.

MATCH (incident:Incidents) 
WHERE incident.incident_number IN ["INC000005590903","INC000005590903"] 
MATCH (device:Devices) 
WHERE device.deviceid_udr in ["RE221869491800Uh_pVAevJpYAhRcJ"] 
MATCH (alarm:Alarms) 
WHERE alarm.entryid_udr in ["ALM123000000110"] 
MATCH incident-[a]-alarm 
MATCH device-[b]-alarm 
MATCH incident-[c]-device 
RETURN incident.incident_number, device.deviceid,alarm.entryid_udr 

15 개의 다른 개체 유형과 관련된 데이터를 찾기 위해 쿼리를 수행하면 매우 느리게 실행됩니다. 이 문제에 접근 할 수있는 방법에 대한 제안이 있으십니까

+0

Incidents.incident_number, Devices.deviceid_udr 및 Alarms.entryid_udr에 대한 색인이 있습니까? – JohnMark13

+0

예, 모든 필드에 색인을 추가했습니다. – ajinkhya

+0

당신이 지금까지 추가 한 것은 느려야합니다 (심지어 확대), 제대로 작동하지 않는 쿼리를 게시 할 수 있습니까? 천천히 얼마나 천천히? – JohnMark13

답변

1

쿼리에서 무슨 일이 일어나고 있는지 분석 할 때 느린 이유를보기가 어렵지 않습니다. 각 초기 일치 항목은 다른 항목과 관련이 없으므로 각 라벨의 전체 도메인이 검색됩니다. 관계를 앞쪽으로 일치 시키면 쿼리를 수행하는 데 걸리는 시간의 크기를 크게 줄일 수 있습니다.

이 쿼리를 시도해보고 질문과 비교해보십시오. 이 쿼리에서

MATCH (incident:Incidents {incident_number : "INC000005590903"}) 
WITH incident 
MATCH (incident)--(device:Devices {deviceid_udr : "RE221869491800Uh_pVAevJpYAhRcJ"}) 
WITH incident, device 
MATCH (device)--(alarm:Alarms {entryid_udr : "ALM123000000110"}) 
WITH incident, device, alarm 
MATCH (incident)--(alarm) 
RETURN incident.incident_number, device.deviceid_udr, alarm.entryid_udr 

, 당신은 사건을 발견하면, 다음 경기는 일치하는 장치를 찾을 수있는 특정 사건에 관계 검색입니다. 일단 발견되면, 알람 일치는 동일한 방식으로 제한됩니다.

또한 각 관계 (장치 사건, 경보 장치, 사건 간 경보 등)에 대해 서로 다른 관계 유형이있는 경우 일치 항목의 관계 유형 사양을 사용하면 상황이 더욱 빨라집니다 또한 검색해야하는 항목의 수를 줄이기 때문에 더욱 그렇습니다. 관계 유형 지정이 없으면 잘못된 레이블이있는 노드와의 관계가 테스트됩니다.

의도적인지 여부는 모르지만 예제에서는 닫힌 링에 대해서도 일치합니다. 일치 루프가 발생하지 않도록주의 할 경우 문제가되지 않지만 닫힌 링이 없으면 쿼리가 성공하지 못합니다. 그냥 내가 지적했다.

+0

이유는이 글을 쓰지 않았기 때문에 IN 절이 더 큰 (깨진) 쿼리에서 요구되는지, 그렇지 않으면 완전히 동의하는지 궁금하다. – JohnMark13

+1

그래, 나는 그 부분에 대해서도 궁금해했다. (그 중 어느 레벨에서든지 여러개의 경기가 있었는지의 여부를 불문), 나는 그것이 그렇게 밝혀지면 우리가 공격 할 수 있다고 생각했다. –