2017-12-18 6 views
1

Nehmen wir an, ich habe Supernodes mit vielen Kanten und möchte schnell die oberen N Kanten für einen bestimmten Knoten zurückgeben. Wie kann ich es mit Arangodb Vertex Centric Index https://docs.arangodb.com/3.1/Manual/Indexing/VertexCentric.html tun?Vertex Centric Indizes für die Sortierung

I skiplist Vertex Centric Index

arangosh> db.collection.ensureIndex({ type: "skiplist", fields: [ "_from", "points" ] }) 

aber die optimiser es nicht abholen erstellen kann mit Sortier Abfrage

FOR edge IN collection 
    FILTER edge._from == "vertices/123456" 
    SORT edge.points DESC 
    LIMIT 0, 10 
    RETURN edge 

Es scheint auch, dass arango Optimierer nicht skiplist Vertex Centric Index nicht aufheben in Traversal-Syntax aber Dokumentation sagt, es sollte:

FOR v, e, p IN 3..5 OUTBOUND @start GRAPH @graphName 
    FILTER p.edges[*].points ALL >0 
    RETURN v 
+0

es den Index abholen Ist, wenn Sie die Traversal Tiefe ändern, um ' 1..5' oder '1..1'? – CoDEmanX

+0

nein. Es ist nicht – irriss

+0

Bitte melden Sie dies auf GitHub: https://github.com/arangodb/arangodb/issues/new. Fügen Sie die Softwareversion und wenn möglich den Datensatz hinzu. Es kann wichtig sein, genau die gleichen Daten mit einer bestimmten Werteverteilung zu verwenden, da vertexzentrische Indizes auf der Grundlage der Selektivitätsschätzwerte nicht immer dem standardmäßigen Kantenindex vorgezogen werden. – CoDEmanX

Antwort

0

schnell wieder oben N Kanten für einen bestimmten Knoten

Es wäre besser, mit dem Knoten zu starten:

FOR v, e IN 1..1 ANY @start @edges 
    SORT e.points DESC 
    LIMIT 10 
    RETURN e 

Hier geht es um so gut sein sollte, wie Sie mit der aktuellen Version bekommen (3.3) von ArangoDB, vorausgesetzt, Sie lassen ArangoDB Index _from - Ich bezweifle, dass das Hinzufügen einer Ausnahmeliste für .points jeden (nützlichen) Unterschied machen wird, es sei denn, Sie verwenden es vielleicht in einem FILTER.

(ich glaube, dass die Indizierung _From ein skiplist verwenden hier unklug wäre. Wenn edges eine Edges Sammlung ist, wird es schon richtig indiziert werden.)

+0

Leider funktioniert es nicht so. Mit dem Standard-Edge-Index kann er alle Kanten für einen gegebenen Knoten sehr schnell finden, aber dann muss er jede von ihnen iterieren und sortieren. Im Falle eines Supernodes kann es Sekunden dauern. – irriss

+0

@Ruslan - Ich habe versucht, meine Antwort zu klären. Wenn Sie einen FILTER (z. B. .points> 0) hinzufügen können, hilft das natürlich. Können Sie uns sagen, wie viele Kanten an dem betreffenden Knoten vorhanden sind, wie lange Ihre verschiedenen Abfragen dauern und wie lange die von mir vorgeschlagene Abfrage dauert? – peak

Verwandte Themen