2017-07-19 2 views
1

Ich bin nur mit arangodb und bekommen haben, um mein erstes echtes Problem Einstieg:arangodb Knoten mit mehreren anderen verbunden

Ist es möglich, Knoten zu suchen, die alle mehrere andere verbunden? Dies scheint eine grundlegende Operation für eine Graph-DB zu sein, aber ich kann mir einfach keine Lösung vorstellen.

Für Referenz, wenn wir das nehmen ‚weiß‘ Beispiel Graph Ich möchte wissen, welche Personen wissen, Charlie und Dave (die nur Bob sein sollte)

knows example graph (keine Bilder noch einzubetten erlaubt)

Für jetzt ist meine beste Schätzung, eine Durchquerung für alle "Ziele" zu beginnen und die Antwort selbst zu reduzieren und zu filtern, ist das wirklich der einzige Weg?

EDIT: OK, weiter zu spezifizieren ich eine andere Verbindung hinzugefügt haben, Vorabend dave weiß auch, aber sollte nicht zurückgegeben werden, da sie nicht charlie weiß

EDIT2: Bisher habe ich mit diesem kommen

Abfrage
FOR start IN ['persons/charlie', 'persons/dave'] 
LET knownBy = (FOR v,e,p IN 1 INBOUND start knows 
    RETURN v) 
FOR p IN knownBy 
    COLLECT person = p 
    LET knows = (FOR v IN 1 OUTBOUND person._id knows 
     RETURN v._id) 
    FILTER knows ALL IN ['persons/charlie', 'persons/dave'] 
    RETURN person 

dies ist jedoch ein bisschen unnatürlich anfühlt, immer die von ‚X‘ bekannt Personen, die Personen zu erhalten, die ‚X‘ ... auch weiß, zeigt der Profiler, dass etwa ein Drittel der Zeit verwendet wird, Um den Plan zu optimieren, muss es eine bessere Lösung geben, oder?

Antwort

0

Wenn wir das bekannte Beispiel nehmen und nur nach zwei verbundenen Knoten suchen, können Sie eine Traversierung auf einem Ziel mit einer Tiefe von 2 starten und filtern, dass der dritte Knoten auf dem Pfad das zweite Ziel sein muss, dann können Sie einfach gebe den zweiten Vertex auf dem Pfad zurück.

FOR v, e, p IN 2 ANY 'persons/charlie' knows 
    FILTER p.vertices[2]._id == 'persons/dave' 
    RETURN p.vertices[1] 

Wenn Sie nach mehr als zwei Vertices suchen, sollte die folgende Abfrage gut funktionieren. Es beginnt eine Durchquerung mit einer Tiefe von 1 und sammelt alle _id der Person Nachbarn und Kontrollen Ihrer Ziele sind alle in den Nachbarn enthalten.

LET targets = ['persons/charlie','persons/dave'] 

FOR person IN persons 
    FILTER targets ALL IN FLATTEN((
    FOR v, e, p IN 1 ANY person._id knows 
    RETURN v._id 
)) 
    RETURN person 
Verwandte Themen