2016-09-21 15 views
6

내 ArangoDB 그래프에 주제, 해당 주제와 관련된 메시지 스레드 및 메시지 스레드 내의 메시지가 있습니다. 그런 식으로 그래프를 탐색하여 메시지 스레드와 관련된 데이터와 메시지 스레드 내부의 메시지 수를 반환하고 싶습니다.ArangoDB : 그래프 순회를 통해 카운트 집계

데이터는 매우 간단하게 구조화됩니다. 주제 노드, 날짜 및 카테고리가 연관된 스레드 노드로 확장되는 가장자리 및 스레드 노드에서 메시지 노드까지의 가장자리가 있습니다.

스레드 노드에 저장된 데이터와 스레드에 첨부 된 메시지의 수를 반환하고 싶습니다.

for v, e, p in 1..2 outbound 구문을 사용하여이를 수행하는 방법을 잘 모르겠습니다. 그 안에 중첩 그래프가있는 for v, e, p in outbound을 사용해야합니까? 여전히 공연가입니까? 지연 죄송합니다

답변

7

, 우리는 3.1 릴리스에 노력하고,

) 난 당신이 올바른 솔루션을 이미 생각 : 당신이 1..2 OUTBOUND 성명에서 달성하고자하는 것을 표현하기 위해 쉽게 할 수 없습니다 . 두 개의 1..1 OUTBOUND 문을 공식화하는 것이 더 쉽습니다. 당신의 설명에서

난 다음 쿼리가 사용 될지 생각 :

FOR thread IN 1 OUTBOUND @start @@threadEdges 
    LET nr = COUNT(FOR message IN 1 OUTBOUND thread @@messageEdges RETURN 1) 
    RETURN { 
    date: thread.date, 
    category: thread.category, 
    messages: nr 
    } 

일부 설명은 : 내가 먼저 관련 스레드를 선택합니다. 다음은 단순히 하나의 스레드에 대한 메시지 일 수있는 하위 쿼리를 수행합니다. 마지막으로 나는 필요한 정보를 반환합니다. 성능면에서

: 데이터 액세스의 측면에서 (대부분의 가능성이 "병목"작업입니다) FOR x IN 1..2 OUTBOUND [...]FOR x IN 1 OUTBOUND [...] FOR y IN 1 OUTBOUND x [...]에 차이가없는 모두 정확히 같은 문서를 관찰해야합니다. 쿼리 최적화는 후자의 경우 약간 느릴 수 있지만 차이는 1ms보다 작습니다.

+0

이것은 효과적으로 우리 팀에서 수행 한 작업입니다. 지금은이 집계에 각각 약 5 초가 걸리지 만 6 개를 한 번에 실행하면 서버가 크게 느려지고 쿼리에 30-40 초가 걸리기 시작합니다. 최대 70,000 개의 메시지가있는 약 60 개의 스레드에 대한 것입니다. 아마 우리가 클러스터로 갈 때, 우리는 이것이 약 5 초로 되돌아가는 것을 볼 것입니다, 그러나 우리는 그것을 빨리 얻고 싶습니다. –

+0

Ok understand;) 진행중인 작업을 최적화 할 수 있도록 익명화 된 데이터 세트를 제공 할 수 있습니까? 우리에게 "실제"데이터 세트를 생성하는 것보다 항상 쉽습니다. 우리는 NDA에 기꺼이 서명 할 것입니다. (나는 모든 통신이 진행 중임을 자세히 알려주지 않으므로, 우리가 이미 그러한 데이터 세트를 가지고 있다면, 그것에 대해 손을 댈 것이고 더 빨리 쿼리를 얻을 것입니다.) 나는 또한 불행합니다. 1 초 이상의 모든 것. – mchacki

+0

저희 팀이 그 일에 착수하고 있습니다! –