Search code examples
azure-cosmosdbgremlintinkerpop3

Migrating Orient Vertex to Cosmos DB using gremlin query


So i have an orient 2.0.0 db, and i want to move this db to cosmos db. The technology i am using is .Net, so i can not use java, and the other richer drivers.

The main problem i am facing during migration is that my orient vertex contain properties that are objects. So is there a way to add objects as property using gremlin query into cosmos db.

The examples on tinkerpop doc, and Azure Cosmos DB Docs for gremlin all show adding simple data types only.


Solution

  • As far as I know, add objects as property is not supported using gremlin query into cosmos db currently.

    My workaroud is that we could flat the object. I wrote a test demo, you could add you own logical to it.

    The following is my detail steps:

    1.Create a C# project and add Microsoft.Azure.Graphs SDK, more detail please refer to packages.config section.

    2.Add a custom class to the project

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

    3. Add a function to covert object to 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 function, we also could get the demo code from 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 it on the local.

        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>