2017-03-15 1 views
0

Daten wie diesesIn ArangoDB, wie ein Knoten in Graphen-Filter durch Mehr Kante auswählen?

a->b,c,d 
b->c,d 
d->a,b 

Abfrage wie diese

FOR n in Nodes 
FOR v,e,p IN 1 ANY n GRAPH 'MyGraph' 
// Only need a 
// HOW TO WRITE: FILTER n have an edge to `b` and n have an edge to `d` 

// This will select a,b,c 
FILTER v._key in [ 'b', 'd' ] 
RETURN p 

ich einen Knoten mit Rand auswählen möchten und d b, b nicht oder d, aber wie?

EDIT

Daten

insert {_key:'a'} in nodes 
insert {_key:'b'} in nodes 
insert {_key:'c'} in nodes 
insert {_key:'d'} in nodes 

insert {_from:'nodes/a',_to:'nodes/b'} into relate 
insert {_from:'nodes/a',_to:'nodes/c'} into relate 
insert {_from:'nodes/a',_to:'nodes/d'} into relate 
insert {_from:'nodes/b',_to:'nodes/c'} into relate 
insert {_from:'nodes/b',_to:'nodes/d'} into relate 
insert {_from:'nodes/c',_to:'nodes/d'} into relate 

Eine sehr Dummy-Lösung ist

for n in nodes 
for v,e,p in 1 OUTBOUND n graph 'MyGraph' 
filter v._key == 'b' 
for v2,e2,p2 in 1 INBOUND v graph 'MyGraph' 
sort v2._key == 'd' 
return v2 

Aber diese Abfrage nur für zwei Bedingungen arbeiten, wenn ich noch eine Bedingung müssen muss ich schreiben eine weitere for Abfrage.

Antwort

1

Ich sehe mehrere Abfragen, die Sie nutzen könnten. Ich habe einen Vertex e zu zeigen, wie sie aussehen, wenn Sie mehr Bedingungen.

I. die meisten performant Abfrage sollte sein:

FOR v IN 1 INBOUND 'nodes/b' graph 'MyGraph' 
    FILTER length(FOR d IN 1 OUTBOUND v graph 'MyGraph' 
    FILTER d._key == 'd' 
    LIMIT 1 
    RETURN 1) == 1 
    FILTER length(FOR e IN 1 OUTBOUND v graph 'MyGraph' 
    FILTER e._key == 'e' 
    LIMIT 1 
    RETURN 1) == 1 
    RETURN v 

Die Abfrage searchs für Nachbarn von b und Filter über einen Teil Abfrage mit den Nachbarn gegründet und überprüft, ob sie mit d und e verbunden sind.

II. eine transparente, sondern auch langsame Abfrage:

LET b = (FOR v IN 1 INBOUND "nodes/b" graph 'MyGraph' RETURN v) 
LET d = (FOR v IN 1 INBOUND "nodes/d" graph 'MyGraph' RETURN v) 
LET e = (FOR v IN 1 INBOUND "nodes/e" graph 'MyGraph' RETURN v) 
RETURN INTERSECTION(b, d, e) 

Die Abfrage macht eine Unterabfrage für jeden Knoten durchsucht und gibt den Schnittpunkt ihrer Nachbarn.

III. eine sehr allgemeine Abfrage mit der Verwendung von bindVars, aber auch die langsamste:

binden Parameter:

{ 
    "targets": ["b","d","e"] 
} 

query:

FOR n IN nodes 
    LET neighbors = (FOR v,e,p IN 1 OUTBOUND n graph 'MyGraph' 
    FILTER v._key IN @targets 
    RETURN v._key) 
FILTER @targets ALL IN neighbors 
RETURN n 

Ja, es ist das langsamste, aber sie haben nie die sich ändern Fragen Sie sich selbst ab, wenn Sie weitere Bedingungen hinzufügen möchten. Sie müssen nur die Bindeparameter ändern.

Verwandte Themen