2016-07-22 28 views
0

Derzeit habe ich ein Diagramm über die DSE Graph Engine mit 100K Knoten gespeichert. Diese Knoten haben das Label "Kunde" und eine Eigenschaft namens "Alter", die ganzzahlige Werte erlaubt.DSE Graph Index auf Integer Interval

schema.vertexLabel("customer").index("custByAge").secondary().by("age").add() 

Ich möchte in der Lage sein, diesen Index zu verwenden, zu beantworten Anfragen, die für Kunden innerhalb einer bestimmten Altersgruppe suchen (zum Beispiel „Alter“ zwischen 10 und 20): Ich habe diese Eigenschaft mit dem folgenden Befehl indiziert. Es scheint jedoch nicht so, als ob der Index, den ich erstellt habe, tatsächlich verwendet wird, wenn ich Kunden nach einem Altersintervall abfrage.

Wenn ich die folgende Abfrage einreichen, eine Liste von Scheitelpunkten wird in etwa 40 ms zurück, was mich führt zu glauben, dass der Index verwendet wird:

g.V().has('customer','age',15) 

Aber wenn ich die folgende Abfrage senden, die Abfrage mal nach 30 sec (wie ich in meiner Konfiguration angegeben haben):

g.V().has('customer','age',inside(10,20)) 
Interruption of result iteration 
Display stack trace? [yN] 

Dies führt mich zu glauben, dass der Index für diese Abfrage nicht verwendet wird. Scheint das richtig? Und wenn der Index nicht verwendet wird, hat jemand einen Ratschlag, wie ich diese Abfrage beschleunigen kann?

EDIT Wie unten durch eine Antwort vorgeschlagen, ich habe auf jedem der oben genannten Abfragen ausführen .profile, mit den folgenden Ergebnissen (nur relevante Informationen angezeigt):

gremlin> g.V().has('customer','age',21).profile() 
==>Traversal Metrics 
... 
    index-query     14.333ms 

gremlin> g.V().has('customer','age',inside(21,23)).profile() 
==>Traversal Metrics 
... 
    index-query     115.055ms 
    index-query     132.144ms 
    index-query     132.842ms 
    >TOTAL      53042.171ms 

Dies läßt mich mit einem einige Fragen:

  1. Gibt die Tatsache, dass .profile() index-query zurückgibt, dass Indizes für meine zweite Abfrage verwendet werden?
  2. Warum hat die zweite Abfrage 3 Indexabfragen, im Gegensatz zu 1 für die erste Abfrage?
  3. Alle Indexabfragen kombiniert, für die zweite Abfrage insgesamt etwa ~ 400ms. Warum dauert die gesamte Abfrage ~ 50000ms? Der Befehl .profile() zeigt nichts anderes als diese Indexabfragen, von denen die zusätzlichen 50000ms kommen.
+0

Die gesamte .profile() Ausgabe wäre nützlich zu sehen.Wenn Sie DataStax Studio verwenden, können Sie zusätzlich die Anmerkungsdetails überprüfen, indem Sie die Maus über die einzelnen Zeilen bewegen. –

+0

Könnten 3 Indexabfragen sein, weil die Zwischenergebnisgrößen die Grenze von 50k Elementen erreichen ..? Wie viele Elemente erwarten Sie? Beachten Sie, dass sekundäre Indizes eine schlechte Wahl für große Ergebnisse sind, sollten Sie stattdessen einen Suchindex versuchen. –

Antwort

0

Verwenden Sie DataStax Studio? Wenn ja, können Sie die Funktion .profile() verwenden, um zu verstehen, wie der Index aufgerufen wird?

Beispiel .profile() benutzen... gV() in() hat ('name', 'Julia Child') count() Profil()

+0

Danke! Bitte beachten Sie die Bearbeitung zu meinem Beitrag ... scheint wie Indizes verwendet werden, aber es dauert viel länger als es sollte. – palitt

0

Sie wollen einen Suchindex verwenden. Für diesen Fall wird es viel viel schneller sein.

Zum Beispiel in KillRVideo:

schema.vertexLabel("movie").index("search").search().by("year").add() 

g.V().hasLabel('movie').has('year', gt(2000)).has('year', lte(2017)).profile() 

dann von Studio-Profil() können wir sehen:

SELECT "community_id", "member_id" FROM "killrvideo"."movie_p" WHERE 
"solr_query" = '{"q":"*:*", "fq":["year:{2000 TO *}","year:{* TO 
2017]"]}' LIMIT ?; with params (java.lang.Integer) 50000 

Standardmäßig wird der Profiler nicht die Spur aller Operationen zeigen, so Die Liste der Indexabfragen, die Sie sehen, wird möglicherweise abgeschnitten. Ändern Sie "max_profile_events" gemäß dieser Dokumentation: https://docs.datastax.com/en/dse/5.1/dse-dev/datastax_enterprise/graph/reference/schema/refSchemaConfig.html