2017-07-05 5 views
0

So habe ich eine orient 2.0.0 db, und ich möchte diese db zu cosmos db verschieben. Die Technologie, die ich verwende, ist .Net, also kann ich Java und die anderen reicheren Fahrer nicht benutzen.

Das Hauptproblem, mit dem ich während der Migration konfrontiert bin, ist, dass mein orient-Vertex Eigenschaften enthält, die Objekte sind. Also gibt es eine Möglichkeit, Objekte als Eigenschaft mithilfe von Gremlin Abfrage in Cosmos db hinzuzufügen.

Die Beispiele auf tinkerpop doc und Azure Cosmos DB Docs für Gremlin zeigen alle nur das Hinzufügen einfacher Datentypen.Migrieren Orient Scheitelpunkt Cosmos DB mit Gremlin Abfrage

Antwort

1

Soweit ich weiß, fügen Sie Objekte als Eigenschaft wird nicht unterstützt mit gremlin Abfrage in Cosmos db derzeit.

Mein Workaroud ist, dass wir das Objekt abflachen könnten. Ich habe eine Testdemo geschrieben, Sie könnten Ihr eigenes logisches hinzufügen.

Das folgende ist mein Detail vor:

1.Erstellen ein C# Projekt und fügen Sie Microsoft.Azure.Graphs SDK, genauer siehe Abschnitt packages.config.

2.Add eine benutzerdefinierte Klasse zum Projekt

public class Custom 
    { 
     public string Type { get; set; } 
     public string Name { get; set; } 
    } 

3. eine Funktion verdeckte Objekt In dem Gremlin String

public static string CovertToGremlinString(object pObject,string type) 
     { 
      var propertyList = new List<string>(); 
      // var dic = new Dictionary<string, string>(); 
      if (pObject == null) return null; 
      var jobject = JObject.FromObject(pObject); 
      propertyList.AddRange(pObject.GetType().GetProperties().Select(prop => prop.Name)); 
      var s = propertyList.Aggregate($"g.addV('{type}')", (current, property) => current + $".property('{property}','{jobject[property]})')"); 
      // dic.Add(type, s); 
      return s; 
     } 

4.Add RunAsync Funktion konnten wir auch die Demo bekommen Code vom Azure-Portal

public async Task RunAsync(DocumentClient client) 
    { 
     Database database = await client.CreateDatabaseIfNotExistsAsync(new Database { Id = "graphdb" }); 

     DocumentCollection graph = await client.CreateDocumentCollectionIfNotExistsAsync(
      UriFactory.CreateDatabaseUri("graphdb"), 
      new DocumentCollection { Id = "Custom" }, 
      new RequestOptions { OfferThroughput = 1000 }); 

     // Azure Cosmos DB supports the Gremlin API for working with Graphs. Gremlin is a functional programming language composed of steps. 
     // Here, we run a series of Gremlin queries to show how you can add vertices, edges, modify properties, perform queries and traversals 
     // For additional details, see https://aka.ms/gremlin for the complete list of supported Gremlin operators 
     var custom = new Custom 
     { 
      Name = "Tom", 
      Type = "1" 
     }; 
     var s = CovertToGremlinString(custom, "custom"); 
     Dictionary<string, string> gremlinQueries = new Dictionary<string, string> 
     { 
      {"Cleanup", "g.V().drop()"}, 
      {"AddVertex 1", s} 
     }; 

     foreach (KeyValuePair<string, string> gremlinQuery in gremlinQueries) 
     { 
      Console.WriteLine($"Running {gremlinQuery.Key}: {gremlinQuery.Value}"); 


      // The CreateGremlinQuery method extensions allow you to execute Gremlin queries and iterate 
      // results asychronously 
      IDocumentQuery<dynamic> query = client.CreateGremlinQuery<dynamic>(graph, (string) gremlinQuery.Value); 
      while (query.HasMoreResults) 
      { 
       foreach (dynamic result in await query.ExecuteNextAsync()) 
       { 
        Console.WriteLine($"\t {JsonConvert.SerializeObject(result)}"); 
       } 
      } 

      Console.WriteLine(); 
     } 

5.Test es auf dem lokalen.

string endpoint = ConfigurationManager.AppSettings["Endpoint"]; 
    string authKey = ConfigurationManager.AppSettings["AuthKey"]; 

    using (DocumentClient client = new DocumentClient(
       new Uri(endpoint), 
       authKey, 
       new ConnectionPolicy { ConnectionMode = ConnectionMode.Direct, ConnectionProtocol = Protocol.Tcp })) 
      { 
       Program p = new Program(); 
       p.RunAsync(client).Wait(); 
      } 

enter image description here

packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.Azure.DocumentDB" version="1.14.0" targetFramework="net452" /> 
    <package id="Microsoft.Azure.Graphs" version="0.2.0-preview" targetFramework="net452" /> 
    <package id="Microsoft.CodeAnalysis.Analyzers" version="1.1.0" targetFramework="net452" /> 
    <package id="Microsoft.CodeAnalysis.Common" version="1.3.0" targetFramework="net452" /> 
    <package id="Microsoft.CodeAnalysis.CSharp" version="1.3.0" targetFramework="net452" /> 
    <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net452" /> 
    <package id="System.Collections" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Collections.Immutable" version="1.1.37" targetFramework="net452" /> 
    <package id="System.Diagnostics.Debug" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Globalization" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Linq" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Reflection.Metadata" version="1.2.0" targetFramework="net452" /> 
    <package id="System.Resources.ResourceManager" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Runtime" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Runtime.Extensions" version="4.0.0" targetFramework="net452" /> 
    <package id="System.Threading" version="4.0.0" targetFramework="net452" /> 
</packages> 
+0

Danke für die Information, ich wusste nicht, dass Objekte nicht unterstützt wurden. Ich werde versuchen, Ihren Tipp zu verwenden, wenn wir uns dafür entscheiden, weiterhin zu Cosmos db zu migrieren. –

Verwandte Themen