Legen Sie mehrere Vertices auf einmal über Kosmos-DB-Graph-API

Ich bin auf der Suche, um schnell einfügen mehrere Scheitelpunkte mithilfe von Azure-Kosmos-DB-Graph-API. Die meisten der aktuellen Microsoft-Beispiele erstellen Sie die Eckpunkte nacheinander, und führen Sie eine Gremlin-Abfrage für jede, etwa so:

IDocumentQuery<dynamic> query = client.CreateGremlinQuery<dynamic>(graph, "g.addV('person').property('id', 'thomas').property('name', 'Thomas').property('age', 44)");

while (query.HasMoreResults)
{                    
    foreach (dynamic result in await query.ExecuteNextAsync())  {   
        Console.WriteLine($"\t {JsonConvert.SerializeObject(result)}"); 
    }
    Console.WriteLine();
}


query = client.CreateGremlinQuery<dynamic>(graph, "g.addV('person').property('id', 'mary').property('name', 'Mary').property('lastName', 'Andersen').property('age', 39)");

while (query.HasMoreResults)
{                    
    foreach (dynamic result in await query.ExecuteNextAsync())  {   
        Console.WriteLine($"\t {JsonConvert.SerializeObject(result)}"); 
    }
    Console.WriteLine();
}

Aber dies ist weniger als ideal, wenn ich Sie anlegen wollen, ein paar tausend Knoten und Kanten zunächst füllen Sie das Diagramm so kann dies einige Zeit dauern.

Dies ist mit Microsoft.Azure.Graphen-Bibliothek v0.2.0-Album

Wie kann ich effizient hinzufügen mehrere vertices auf einmal, um den Kosmos DB, so kann ich Sie später Abfragen mithilfe des Graph-API-syntax?

InformationsquelleAutor kmcnamee | 2017-06-02



5 Replies
  1. 6

    Habe ich herausgefunden, dass der Schnellste Weg, um Samen zu Ihrem Diagramm, ist die Verwendung der Dokument-API. Unter Verwendung dieser Technik konnte ich einfügen 5500+ Scheitelpunkte/Kanten pro Sekunde auf einem einzigen Entwicklungsrechner. Der trick ist, zu verstehen, das format, der Kosmos erwartet für beide Kanten und Ecken. Fügen Sie einfach ein paar Ecken und Kanten zu Ihrem Diagramm durch die gremlin-API und überprüfen Sie dann das format dieser Dokumente durch, indem Sie den Daten-Explorer in Azure und ausführen eines Dokuments Abfrage SELECT * FROM c.

    Bei der Arbeit habe ich aufgebaut Licht ORM, die verwendet reflektion, um zu nehmen POCOs für Kanten und Ecken und konvertieren Sie Sie in das format, dass Sie sehen die portal. Ich hoffe, dass open source hier schnell, an welcher Stelle ich wahrscheinlich release ein Nuget-Paket und begleitenden blog-post. Hoffentlich ist in der Zwischenzeit dies wird helfen, zeigen Sie in die richtige Richtung, lassen Sie mich wissen, wenn Sie weitere Fragen zu diesem Ansatz.

    • Ich versuche zum einfügen von Knoten und Kanten mit nur einem CreateDocument-Aufruf, aber das Ergebnis ist, dass mein Diagramm ist zu verwerfen die meisten Werte. Können Sie teilen, was Sie hochgeladen haben, werden die Objekte erstellt? Danke!
    • Ich hatte das gleiche Problem, aber die Eigenschaften/Werte wurden in meinem Fall nicht verloren, ich habe Sie, wenn ich das Dokument-db-api abgerufen werden. Aber Sie sind nicht sichtbar in der azure graph ui. Statt der Eigenschaften, die in meinem Fall zeigt es die richtige id und ein label mit dem Wert ‚NativeVertex‘. Ich war leider nicht in der Lage, mehr details finden Sie auf dieser.
    • können Sie uns mehr über diese? Dank ChiefWiggum
    • Wenn Sie erst einmal die richtige graphSON, wie Sie laden Sie Sie als graph dann? Ich habe versucht, die migraiton tool ohne Erfolg.
    • haben Sie loslassen, sagte ORM?
    • Carter, Haben Sie geschrieben, der blog-post auf das gleiche ?

  2. 1

    Vorausgesetzt CosmosDB ist 100% TinkerPop-kompatibel und je nach gremlin executor-timeout-Einstellung, die Sie sollten in der Lage sein, um aktualisieren Sie Ihre gremlin-Skript, um mehrere Vorgänge auf einmal.

    Beispiel:

    g.addV('person').property('id', 'mary').property('name', 'Mary').property('lastName', 'Andersen').property('age', 39)

    kann umgeformt werden zu:


    g.addV('person').property('id', 'mary').property('name', 'Mary').property('lastName', 'Andersen').property('age', 39); g.addV('person').property('id', 'david').property('name', 'David').property('lastName', 'P').property('age', 24);

    und etc etc.

    Ihre gremlin-Skript ist auch einfach nur Groovy-code, so können Sie auch selbst schreiben, loops und was Sie nicht sein können, erstellen Sie Eckpunkte, fügen Sie Eigenschaften, und so weiter.

    • Danke, ich vermutete, dass es möglich sein soll Semikolon trennen die mehrere g.addV-Anweisungen, wie Sie in Ihrer Antwort jedoch die CosmosDb Graph-API erscheint, führen Sie einfach die erste Anweisung und nicht alle Folgeanträge. Zum Beispiel läuft das Semikolon trennen addV dann läuft g.V().count() auf eine leere Auflistung gibt nur 1. Vielleicht ist dies etwas spezifisch auf die CosmosDB Graph-API-Implementierung?
    • Ich wäre sehr überrascht, wenn das wahr wäre. Ist dieser client-code open source? Sie konnte werfen Sie einen Blick und Lesen Sie den code dort zu sehen, wie es verarbeitet das Skript, die Sie Einreichen. Aber ich würde wirklich vorstellen, dass es gerade nach vorn, den genauen Skript, um die GremlinServer.
    • Danke für die Anregung. Die Quelle für das SDK nicht, sich zu open Source noch. Jedoch habe ich spin up Fiddler und schauen, was die CosmosDB Graph-API sendet an den server. Es sieht nicht so aus, sendet es über die Gremlin-Skript für die addV aber es sendet den JSON für das Objekt seiner Los zu legen. So erscheint es, dass die client-Bibliothek bietet einige Umwandlung. Für eine einfache g.V().count() sendet es über JSON mit einer Abfrage in der form {„query“:“WÄHLEN Sie N_0 VON Knoten N_0 WO (IS_DEFINED(N_0._isEdge) = false“)“}
  3. 1

    Wir brauchten ein tool, um uns zu helfen die Migration der Daten zu cosmosdb graph aber da war nichts verfügbar ich landete dies – https://github.com/abbasc52/graphdb-migration-tool

    Können Sie diese verwenden, um Daten aus einigen sql-oder json, verwandeln Sie es und schieben Sie es auf graph-Datenbank.
    Es unterstützt die parallele Ausführung von gremlin Abfragen, so ist es deutlich schneller.

    Standardmäßig feuert Sie 10 gremlin-Abfragen parallel, aber Sie erhöhen kann es durch die übergabe batchSize in der Grafik-config-Datei

  4. 0

    Dem Data Migration Tool unterstützt SQL-API oder MongoDB Szenarien, wenn es NICHT der Unterstützung der Grafik-api Vertex – Kanten direkt aus der box, in diesem Stadium. Wie bereits erwähnt, könnten Sie wahrscheinlich verwenden eine generierte graph query-Ergebnis als Haupt-Referenz-Muster, dann machen Sie einige Suchen und Ersetzen… auf Ihre Quelle, um am Ende mit der richtigen format… aber ich fand Sie einfach laufen eine Konsole-Anwendung, streaming-Daten mehr ausreichend. Ich war in der Lage, um die Wiederverwendung der gleichen Konsole app mit Marvel sowie Flughafen-Flüge Szenarien und alle die ich tun musste, war, ändern ein paar Zeilen code jedes mal.
    Code wird in 2 Sequenzen. Im ersten block extrahiert und konvertiert die Eckpunkte. Zweite Sequenz extrahiert und konvertiert Felder-Beziehungen als Kanten. Alles, was ich brauchte, um zu ändern, war die Felder, die ich brauche, zu extrahieren. Dies kann ein wenig Zeit nehmen, um zu konvertieren, abhängig von der Größe der Daten, aber es gab mir genau die erwarteten Ergebnisse jeder Zeit, ohne ständig zu ändern Daten an der Quelle 😉.

  5. 0

    Im mit diesem code zu einem einfachen Beispiel: multi Vertex von NodeJS

    JS:

    const __ = gremlin.process.statics;
    let trt = await g.withBulk(true).V('test-3').fold().coalesce(__.unfold().property(gremlin.process.cardinality.single, 'runways', 4), __.addV('truongtest').property(gremlin.process.t.id, 'test-3').property(gremlin.process.cardinality.single, 'runways', 4))
            .V('test-10').fold().coalesce(__.unfold().property(gremlin.process.cardinality.single, 'runways', 100), __.addV('truongtest').property(gremlin.process.t.id, 'test-10').property(gremlin.process.cardinality.single, 'runways', 100))
            .next()
            
    //if you wanna add alot , using loop 
    
    let trt = await g.withBulk(true)
    trt = trt.V('test-3').fold().coalesce(__.unfold().property(gremlin.process.cardinality.single, 'runways', 4), __.addV('truongtest').property(gremlin.process.t.id, 'test-3').property(gremlin.process.cardinality.single, 'runways', 4))
            
    trt = trt.V('test-10').fold().coalesce(__.unfold().property(gremlin.process.cardinality.single, 'runways', 100), __.addV('truongtest').property(gremlin.process.t.id, 'test-10').property(gremlin.process.cardinality.single, 'runways', 100))
    
    //after done run next()
    trt.next()

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.