2016-10-18 7 views
6

두 그래프의 거대한 결합을 사용하여 그래프의 일부를 구성하고 두 컬렉션 중 하나에 문서를 추가 할 때마다 그래프를 실행합니다. 쿼리는 older post을 기반으로합니다.ArangoDB : 예제로 쿼리 함수로 삽입

FOR fromItem IN fromCollection 
    FOR toItem IN toCollection 
     FILTER fromItem.fromAttributeValue == toItem.toAttributeValue 
     INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection 

내 데이터 집합을 완료하는 데 약 55,000 초가 걸립니다. 나는 그것을 더 빨리 만들기위한 제안을 절대적으로 환영 할 것이다.

  1. 내가 upsert이 필요합니다

    는하지만이 관련 문제가 있습니다. 일반적으로 upsert은 괜찮을 것이지만,이 경우에는 내가 열쇠를 알 수있는 방법이 없으므로 도움이되지 않습니다. 키를 앞에 놓으려면, 예를 들어 다른 동일하거나 기존의 모서리의 키를 찾기 위해 쿼리해야합니다. 그것은 내 성능을 죽일하지 않는 한 합리적인 것처럼 보이지만 AQL에서 조건부로 쿼리를 구성하여 상응하는 가장자리가 아직 존재하지 않으면 가장자리를 삽입하는 방법을 모르지만, 상응하는 가장자리 존재하지 않습니다. 어떻게해야합니까?

  2. 데이터가 컬렉션에 추가 될 때마다이 작업을 실행해야합니다. 최신 데이터에서만이 작업을 실행하여 전체 컬렉션에 참여하지 않는 방법이 필요합니다. 내가 새로 삽입 한 레코드에만 참여할 수있게하는 AQL을 작성하려면 어떻게해야합니까? Arangoimp가 추가되었으므로 어떤 순서로 업데이트할지 보장 할 수 없으므로 노드를 생성하는 동시에 가장자리를 만들 수 없습니다. 새 데이터에만 어떻게 참여할 수 있습니까? 나는 기록이 추가 될 때마다 55k 초를 보내고 싶지 않다.

    db._explain(<your query here>);

    하는 쇼의 출력을 보면 알 수 있듯이

+1

동일한 질문으로 다른 데이터베이스에서 쿼리를 수행했습니다. 다시 연결할 때 데이터 세트의 크기를 어떻게 줄입니까? 나를 위해 일한 해결책은'linked = false'와 같은 필드를'fromCollection'과'toCollection' 콜렉션 모두에 추가하는 것입니다. –

+1

... 그러면 새 문서를 두 컬렉션에 삽입 할 때 항상'linked'를'false'로 설정합니다. 문서를 링크 할 때'link'를'true'로 설정합니다. 속도를 높이기 위해'linked'에 색인을 넣기를 원할 것입니다. 모든 것이'linked = false' 값을 가지기 때문에 처리 속도가 매우 빠르지 만 처음에는 느린 속도로 처리됩니다. –

+1

당신을 위해 그것을 할 Foxx 응용 프로그램을 작성할 수, 다른 사람의 질문에 대한 예제 Foxx 응용 프로그램을 문서화, 사용할 수 있습니다 [여기] (http://stackoverflow.com/questions/39897954/arangodb-aql-recursive-graph- traversal)을 StackOverflow에 추가합니다. Foxx를 멋지고 빠르게 사용할 수 있고, 당신이 묘사하고있는 것과 같은 기능이 완벽한 유스 케이스라는 점을 배우려면 시간이 필요합니다. 이 함수는 매개 변수를 필요로하지 않으며, 단지 실행되며,'linked = false'로 그 레코드들을 검사 할 것입니다. –

답변

8

어떤 인덱스없이 작성으로 당신이 당신의 쿼리를 실행하면, 다음은 두 개의 중첩 전체 컬렉션 스캔을해야 할 것 뭔가 같은 :

1 SingletonNode    1 * ROOT 
    2 EnumerateCollectionNode  3  - FOR fromItem IN fromCollection /* full collection scan */ 
    3 EnumerateCollectionNode  9  - FOR toItem IN toCollection /* full collection scan */ 
    4 CalculationNode    9   - LET #3 = (fromItem.`fromAttributeValue` == toItem.`toAttributeValue`) /* simple expression */ /* collections used: fromItem : fromCollection, toItem : toCollection */ 
    5 FilterNode     9   - FILTER #3 
    ... 

당신이 경우에

db.toCollection.ensureIndex({"type":"hash", fields ["toAttributeValue"], unique:false})` 

fromCollection에 전체 테이블 콜렉션 스캔이 있고 발견 된 각 항목에 대해 toCollection에 해시 검색이 있습니다. 그러면 훨씬 빨라집니다. 모든 것이 일괄 처리되므로 상황이 이미 개선 될 것입니다. db._explain()이 표시됩니다 : 간단하게 모든 정점에 가져 오기 시간의 타임 스탬프를 추가하고, 사용 :

FOR fromItem IN fromCollection 
    FILTER fromItem.timeStamp > @lastRun 
    FOR toItem IN toCollection 
     FILTER fromItem.fromAttributeValue == toItem.toAttributeValue 
     INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection 

과의 fromCollection에서 최근에 삽입 된 항목에만 작업에

1 SingletonNode    1 * ROOT 
    2 EnumerateCollectionNode  3  - FOR fromItem IN fromCollection /* full collection scan */ 
    8 IndexNode     3  - FOR toItem IN toCollection /* hash index scan */ 

하는 것은 상대적으로 쉽다 물론 timeStamp 속성에 skiplist 색인을 넣으십시오. fromCollection.

fromCollection의 새 정점을 발견하는 데는 효과적입니다. toCollection에서 old 정점에 연결된 새 정점을 fromCollection으로 "간과"합니다.

당신은 (fromCollection에서 fromAttributeValue에 인덱스를 잊지 마세요)을 fromCollection의 역할과 쿼리의 toCollection를 상호 교환하고 정점에서이처럼, 오래된 경우에만 가장자리에 넣어에 기억하여이를 발견 할 수 있습니다 :

FOR toItem IN toCollection 
    FILTER toItem.timeStamp > @lastRun 
    FOR fromItem IN fromCollection 
     FILTER fromItem.fromAttributeValue == toItem.toAttributeValue 
     FILTER fromItem.timeStamp <= @lastRun 
     INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection 

이 두 항목이 모두 함께 사용해야합니다. 완전히 작동 한 예제 here을 찾으십시오.

+0

감사합니다. Max! 타임 스탬프를 사용할 때 발생할 수있는 한 가지 문제점은 다양한 콜렉션이 다른 속도로 가져 오기 때문에 지난 밤에'fromCollection'의 데이터를 가져 왔지만 한 시간 전에'toCollection'의 데이터를 가져온 것입니다. 또한 때로는 새로운 데이터가 오랜 시간 전에 가져온 데이터와 관련이 있어야합니다. 이것은'fromItem'과'toItem' 둘 다 이전에 가져온 것이지만, 오직 하나만이 아니라면 작동합니다. 우리 팀은 가장자리에 대한 결정 론적 핵심 규칙을 생각해 냈습니다. 따라서 중복은 문제가 아닙니다. 이제는 삽입물의 성능입니다. –