2016-05-22 19 views
1

Mein aktuelles Szenario ist wie ich habe ich Produkte, Kunde und Verkäufer Knoten in meinem Graph Ökosystem. Das Problem, das ich bin vor ist, dass ich EinzigartigkeitWie kann man eine einzelne Kante in einem Graphen für eine gegebene order_id sicherstellen?

, um sicherzustellen, habe

(customer)-[buys]->product

mit order_item_id als Eigentum der kauft Beziehung edge.I haben, um sicherzustellen, dass es ein einzigartiger Rand mit Kaufeigenschaft für eine gegebene order_item_id. Auf diese Weise möchte ich sicherstellen, dass meine Graphinsertion idempotent bleibt und für eine gegebene order_item_id keine wiederholten Kaufkanten erzeugt werden.

eine order_item_id Eigenschaft Erstellen

if(!mgmt.getPropertyKey("order_item_id")){ 
    order_item_id=mgmt.makePropertyKey("order_item_id").dataType(Integer.class).make(); 
}else{ 
    order_item_id=mgmt.getPropertyKey("order_item_id"); 
} 

Was ich bisher gefunden habe ist, dass eindeutigen Index bauen könnte mein Problem lösen. wie

if(mgmt.getGraphIndex('order_item_id')){ 
    ridIndexBuilder=mgmt.getGraphIndex('order_item_id') 
}else{ 
    ridIndexBuilder=mgmt.buildIndex("order_item_id",Edge.class).addKey(order_item_id).unique().buildCompositeIndex(); 
} 

Oder ich kann auch so etwas wie

mgmt.buildEdgeIndex(graph.getOrCreateEdgeLabel("product"),"uniqueOrderItemId",Direction.BOTH,order_item_id)

  • verwenden Wie soll ich diese Einzigartigkeit der einzelnen Käufen für eine gegebene order_item_id Rand gewährleisten. (Ich habe keinen Anwendungsfall basierend auf order_item_id suchen.)
  • Was ist der grundlegende Unterschied in einen Index auf der Kante zu schaffen mit buildIndex und mit buildEdgeIndex?

Antwort

2

Sie können die Eindeutigkeit von Eigenschaften nicht auf Kantenebene erzwingen, z. zwischen zwei Vertices (siehe this question on the mailing list). Wenn ich Ihr Problem richtig verstehe, sollte das Erstellen eines on-edge mit einer Eindeutigkeitseinschränkung für eine bestimmte Eigenschaft Ihr Problem beheben, obwohl Sie nicht planen, diese Kanten nach der indizierten Eigenschaft zu durchsuchen. Dies kann jedoch zu Leistungsproblemen führen, wenn viele Kanten gleichzeitig aufgrund von Sperren eingefügt werden. Abhängig von der Rate, mit der Sie Daten einfügen, müssen Sie möglicherweise die Sperre überspringen (= die Eindeutigkeitsbeschränkung überspringen) und doppelte Kanten riskieren, dann die Deduplizierung selbst zur Ablesezeit durchführen und/oder Post-Import-Batch-Jobs ausführen, um das Potential zu bereinigen Duplikate.

  • buildIndex() baut einen globalen, Graph-Index (entweder CompositeIndex oder MixedIndex). Diese Art von Indizes ermöglicht es Ihnen in der Regel, Startpunkte Ihrer Traversal innerhalb eines Graphen schnell zu finden.
  • buildEdgeIndex() können Sie jedoch eine lokale, "vertex-centric index" erstellen, die das Traversal zwischen Scheitelpunkten mit einem potenziell high degree (= große Anzahl von eingehenden Kanten, eingehenden und/oder ausgehenden) beschleunigen soll. Solche Vertices werden "Super Nodes" genannt (siehe A solution to the supernode problem blog post from Aurelius) - und obwohl sie eher selten sind, ist die Wahrscheinlichkeit, sie zu überqueren, nicht so niedrig.

Referenz: Titan documentation, Ch. 8 - Indexing for better Performance.

+0

noch einmal für detaillierte Informationen .are Leistungsprobleme so schwerwiegend, dass wir Sperren überspringen können und Datenbankkonsistenz auf dem Spiel steht? Gibt es einen Leistungsnachteil, selbst wenn ich keine Echtzeit-Ergebnisse von titan db benötige? Haben schwere Sperreneinfügungen Auswirkungen auf Leseabfragen? –

+0

Die Leistungsbeeinträchtigung hängt wirklich von der Größe des Diagramms und der Rate ab, mit der Sie Daten einfügen. Bei der Skalierung werden Sie wahrscheinlich immer das Sperren vermeiden wollen, um die Schreibleistung zu erhalten. Wenn Sie wirklich an Geschwindigkeit interessiert sind, denke ich, dass es am besten ist, einen Leistungstest mit und ohne Sperren einzurichten und zu sehen, welche Art von Lese- und Schreibleistung Sie erhalten. – jbmusso

+0

Ich kam mit Pre-Insertion-Check, der mir geholfen hat, Index an den Rändern zu überspringen. Es prüft die Existenz bestimmter Kante vor dem Erstellen. Ich bin immer noch nicht in der Lage zu verdauen, Schlösser wegen der Geschwindigkeit loszulassen (vielleicht meine ACID-Wurzeln). Ich denke, der Aufwand für den Post-Import-Job wird groß sein. Ist das Loslassen von Locks auch bei Vertex-Einfügung akzeptabel? –