如何创建和删除边缘属性(泰坦1.0)在.net mvc中使用C#? [英] How to Create and Delete edge properties (Titan 1.0) using c# in .net mvc?

查看:121
本文介绍了如何创建和删除边缘属性(泰坦1.0)在.net mvc中使用C#?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是Titan 1.0和gremlin服务器来创建和删除顶点。我想在我的.net项目中实现这个逻辑。我不知道在asp.net中是否有任何预制插件用于titan和gremlin服务器?



目前,我直接使用命令提示符来创建和删除所需的顶点和边缘。我如何在我的.net MVC项目中实现它?

解决方案

我在我的项目中创建了一个与Gremlin交互的类服务器使用REST API。你可以做一些小的修改使它适合你。

  using System; 
使用System.Collections.Generic;
使用System.Linq;
使用System.Text;
使用System.Threading.Tasks;
使用System.Web;
使用Newtonsoft.Json;
使用RestSharp;
使用urNotice.Common.Infrastructure.Common.Config;
使用urNotice.Common.Infrastructure.Common.Constants;
使用urNotice.Common.Infrastructure.Common.Enum;
使用urNotice.Common.Infrastructure.commonMethods;
使用urNotice.Common.Infrastructure.Model.urNoticeModel.DynamoDb;
使用urNotice.Services.NoSqlDb.DynamoDb;

namespace urNotice.Services.GraphDb
{
public class GremlinServerGraphEdgeDb:IGraphEdgeDb
{
private delegate Dictionary< string,string> AddEdgeAsyncDelegate(string userName,string graphName,Dictionary< string,string>属性);

public Dictionary< string,string> AddEdge(string userName,string graphName,Dictionary< string,string>属性)
{
string url = TitanGraphConfig.Server;
var response = CreateEdge(graphName,properties,url);

//将边缘添加到dynamodb。
var edgeDetail = new OrbitPageEdgeDetail
{
url = url,
edgeId = response [TitanGraphConstants.Id],
graphName = graphName,
properties = properties
};

IDynamoDb dynamoDbModel = new DynamoDb();
dynamoDbModel.UpsertOrbitPageEdgeDetail(edgeDetail,userName,properties [EdgePropertyEnum._inV.ToString()],properties [EdgePropertyEnum._outV.ToString()]);

//添加edgeDetail以加快查询速度。
//dynamoDbModel.UpsertOrbitPageEdgeForQueryDetail(edgeDetail,userName,properties [EdgePropertyEnum._inV.ToString()],properties [EdgePropertyEnum._outV.ToString()]);

返回响应;
}

public Dictionary< string,string> DeleteEdge(string inV,string outV,string label)
{
string url = TitanGraphConfig.Server;

IDynamoDb dynamoDbModel = new DynamoDb();
字符串uniqueKey = OrbitPageUtil.GenerateUniqueKeyForEdgeQuery(inV,label,outV);
var edgeInfo = dynamoDbModel.GetOrbitPageCompanyUserWorkgraphyTable(
DynamoDbHashKeyDataType.EdgeDetail.ToString(),
uniqueKey,
null);

if(edgeInfo == null)
return null;

var response = DeleteEdgeNative(TitanGraphConfig.Graph,edgeInfo.CompareId,url);
dynamoDbModel.DeleteOrbitPageCompanyUserWorkgraphyTable(edgeInfo);

//删除创建仅用于查询目的的边缘细节。
// string uniqueKey = OrbitPageUtil.GenerateUniqueKeyForEdgeQuery(inV,label,outV);
// edgeInfo = dynamoDbModel.GetOrbitPageCompanyUserWorkgraphyTable(
// DynamoDbHashKeyDataType.EdgeDetail.ToString(),
// uniqueKey,
// null);

// if(edgeInfo!= null)
// dynamoDbModel.DeleteOrbitPageCompanyUserWorkgraphyTable(edgeInfo);

返回响应;
}

public Dictionary< string,string> AddEdgeAsync(string userName,string graphName,Dictionary< string,string>属性)
{
var addEdgeAsyncDelegate = new GremlinServerGraphEdgeDb.AddEdgeAsyncDelegate(AddEdge);
addEdgeAsyncDelegate.BeginInvoke(userName,graphName,properties,null,null);
返回null;
}

私人词典< String,String> CreateEdge(string graphName,Dictionary< string,string> properties,string url)
{
var uri = new StringBuilder(url +/?gremlin =);

//http://localhost:8182/?gremlin=gV(8320).next().addEdge(\"Using\",gV(12416).next(),\"Desc, Item使用的人,time,12345)

string graphProperties = string.Empty;

// _ outV必须是第一个参数
graphProperties + ='+ properties [EdgePropertyEnum._label.ToString()] +',gV(+ properties [EdgePropertyEnum._inV .ToString()] +).next(),;
foreach(KeyValuePair< string,string>属性中的属性)
{
if(property.Key == EdgePropertyEnum._inV.ToString()|| property.Key == EdgePropertyEnum._outV。 ToString()|| property.Key == EdgePropertyEnum._label.ToString())
{
//什么都不做。可能将来我们会在这里写逻辑。
}
else
{
if(property.Key == EdgePropertyEnum.PostedDateLong.ToString()|| property.Key == EdgePropertyEnum.SalaryAmount.ToString())
graphProperties + ='+ property.Key +',+ property.Value +,;
else
graphProperties + ='+ property.Key +','+ property.Value +',;



if(!string.IsNullOrEmpty(graphProperties))
{
graphProperties = graphProperties.Substring(0,graphProperties.Length - 2 );
}

uri.Append(gV(+ properties [EdgePropertyEnum._outV.ToString()] +).next()。addEdge(+ graphProperties +); );
var client = new RestClient(uri.ToString());
var request = new RestRequest();

request.Method = Method.GET;
request.AddHeader(Accept,application / json);
request.Parameters.Clear();
request.AddParameter(application / json,,ParameterType.RequestBody);

var res = client.Execute(request);
var content = res.Content; //原始内容作为字符串

动态jsonResponse = JsonConvert.DeserializeObject(content);
var response = new Dictionary< String,String>();
response [status] =200;
response [CreateEdgeStatus] =200;
response [TitanGraphConstants.Id] = jsonResponse.result.data [0] .id;
响应[TitanGraphConstants.RexsterUri] = url;
返回响应;
}

私人词典< String,String> DeleteEdgeNative(string graphName,string edgeId,string url)
{
var uri = new StringBuilder(url +/?gremlin =);
// var uri = new StringBuilder(url +/ graphs /+ graphName +/ edges /+ edgeId);

// http:// localhost:8182 /?gremlin = gE('odxqo-6f4-2hat-9kw').drop()

uri.Append( gE(''+ edgeId +'').drop(););

var client = new RestClient(uri.ToString());
var request = new RestRequest();

request.Method = Method.GET;
request.AddHeader(Accept,application / json);
request.Parameters.Clear();
request.AddParameter(application / json,,ParameterType.RequestBody);

var res = client.Execute(request);
var content = res.Content; //原始内容作为字符串

动态jsonResponse = JsonConvert.DeserializeObject(content);
var response = new Dictionary< String,String>();
response [status] =200;
response [DeleteEdgeStatus] =200;
//response[TitanGraphConstants.Id] = jsonResponse.result.data [0] .id;
//response[TitanGraphConstants.RexsterUri] = url;
返回响应;



$ / code $ / pre
$ b $ p

注释如果您遇到任何问题在课堂上。


I was using Titan 1.0 with gremlin server to create and delete vertex. I want to implement this logic in my .net project. I wonder if there is any pre build plugin for titan and gremlin server in asp.net?

Currently i'm directly using command prompt to create and delete the required vertices and edges. how can I implement it in my .net MVC project?

解决方案

I've created one class in my project for interacting with Gremlin server using REST API. you can make small changes to make it work for you.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Newtonsoft.Json;
using RestSharp;
using urNotice.Common.Infrastructure.Common.Config;
using urNotice.Common.Infrastructure.Common.Constants;
using urNotice.Common.Infrastructure.Common.Enum;
using urNotice.Common.Infrastructure.commonMethods;
using urNotice.Common.Infrastructure.Model.urNoticeModel.DynamoDb;
using urNotice.Services.NoSqlDb.DynamoDb;

namespace urNotice.Services.GraphDb
{
    public class GremlinServerGraphEdgeDb : IGraphEdgeDb
    {
        private delegate Dictionary<string, string> AddEdgeAsyncDelegate(string userName, string graphName, Dictionary<string, string> properties);

    public Dictionary<string, string> AddEdge(string userName, string graphName, Dictionary<string, string> properties)
    {
        string url = TitanGraphConfig.Server;
        var response = CreateEdge(graphName, properties, url);

        // add edge to dynamodb.
        var edgeDetail = new OrbitPageEdgeDetail
        {
            url = url,
            edgeId = response[TitanGraphConstants.Id],
            graphName = graphName,
            properties = properties
        };

        IDynamoDb dynamoDbModel = new DynamoDb();
        dynamoDbModel.UpsertOrbitPageEdgeDetail(edgeDetail, userName, properties[EdgePropertyEnum._inV.ToString()], properties[EdgePropertyEnum._outV.ToString()]);

        //Adding edgeDetail for faster query.
        //dynamoDbModel.UpsertOrbitPageEdgeForQueryDetail(edgeDetail, userName, properties[EdgePropertyEnum._inV.ToString()], properties[EdgePropertyEnum._outV.ToString()]);

        return response;
    }

    public Dictionary<string, string> DeleteEdge(string inV, string outV, string label)
    {
        string url = TitanGraphConfig.Server;

        IDynamoDb dynamoDbModel = new DynamoDb();
        string uniqueKey = OrbitPageUtil.GenerateUniqueKeyForEdgeQuery(inV, label, outV);
        var edgeInfo = dynamoDbModel.GetOrbitPageCompanyUserWorkgraphyTable(
                   DynamoDbHashKeyDataType.EdgeDetail.ToString(),
                   uniqueKey,
                   null);

        if (edgeInfo == null)
            return null;

        var response = DeleteEdgeNative(TitanGraphConfig.Graph, edgeInfo.CompareId, url);
        dynamoDbModel.DeleteOrbitPageCompanyUserWorkgraphyTable(edgeInfo);

        //Deleting Edge detail creating for only query purpose.
        //string uniqueKey = OrbitPageUtil.GenerateUniqueKeyForEdgeQuery(inV, label, outV);
        //edgeInfo = dynamoDbModel.GetOrbitPageCompanyUserWorkgraphyTable(
        //            DynamoDbHashKeyDataType.EdgeDetail.ToString(),
        //            uniqueKey,
        //            null);

        //if(edgeInfo!=null)
        //    dynamoDbModel.DeleteOrbitPageCompanyUserWorkgraphyTable(edgeInfo);

        return response;
    }

    public Dictionary<string, string> AddEdgeAsync(string userName, string graphName, Dictionary<string, string> properties)
    {
        var addEdgeAsyncDelegate = new GremlinServerGraphEdgeDb.AddEdgeAsyncDelegate(AddEdge);
        addEdgeAsyncDelegate.BeginInvoke(userName, graphName, properties, null, null);
        return null;
    }

    private Dictionary<String, String> CreateEdge(string graphName, Dictionary<string, string> properties, string url)
    {
        var uri = new StringBuilder(url + "/?gremlin=");

        //http://localhost:8182/?gremlin=g.V(8320).next().addEdge("Using",g.V(12416).next(),"Desc","Item used by Person","time",12345)

        string graphProperties = string.Empty;

        //_outV must be the first parameter
        graphProperties += "'" + properties[EdgePropertyEnum._label.ToString()] + "', g.V(" + properties[EdgePropertyEnum._inV.ToString()] + ").next() ,";
        foreach (KeyValuePair<string, string> property in properties)
        {
            if (property.Key == EdgePropertyEnum._inV.ToString() || property.Key == EdgePropertyEnum._outV.ToString() || property.Key == EdgePropertyEnum._label.ToString())
            {
                //do nothing.. May be in future we will write logic here.                    
            }
            else
            {
                if (property.Key == EdgePropertyEnum.PostedDateLong.ToString() || property.Key == EdgePropertyEnum.SalaryAmount.ToString())
                    graphProperties += "'" + property.Key + "', " + property.Value + " ,";
                else
                    graphProperties += "'" + property.Key + "', '" + property.Value + "' ,";
            }
        }

        if (!string.IsNullOrEmpty(graphProperties))
        {
            graphProperties = graphProperties.Substring(0, graphProperties.Length - 2);
        }

        uri.Append("g.V(" + properties[EdgePropertyEnum._outV.ToString()] + ").next().addEdge(" + graphProperties + ");");
        var client = new RestClient(uri.ToString());
        var request = new RestRequest();

        request.Method = Method.GET;
        request.AddHeader("Accept", "application/json");
        request.Parameters.Clear();
        request.AddParameter("application/json", "", ParameterType.RequestBody);

        var res = client.Execute(request);
        var content = res.Content; // raw content as string 

        dynamic jsonResponse = JsonConvert.DeserializeObject(content);
        var response = new Dictionary<String, String>();
        response["status"] = "200";
        response["CreateEdgeStatus"] = "200";
        response[TitanGraphConstants.Id] = jsonResponse.result.data[0].id;
        response[TitanGraphConstants.RexsterUri] = url;
        return response;
    }

    private Dictionary<String, String> DeleteEdgeNative(string graphName, string edgeId, string url)
    {
        var uri = new StringBuilder(url + "/?gremlin=");
        //var uri = new StringBuilder(url + "/graphs/" + graphName + "/edges/" + edgeId);

        //http://localhost:8182/?gremlin=g.E('odxqo-6f4-2hat-9kw').drop()

        uri.Append("g.E('" + edgeId + "').drop();");

        var client = new RestClient(uri.ToString());
        var request = new RestRequest();

        request.Method = Method.GET;
        request.AddHeader("Accept", "application/json");
        request.Parameters.Clear();
        request.AddParameter("application/json", "", ParameterType.RequestBody);

        var res = client.Execute(request);
        var content = res.Content; // raw content as string 

        dynamic jsonResponse = JsonConvert.DeserializeObject(content);
        var response = new Dictionary<String, String>();
        response["status"] = "200";
        response["DeleteEdgeStatus"] = "200";
        //response[TitanGraphConstants.Id] = jsonResponse.result.data[0].id;
        //response[TitanGraphConstants.RexsterUri] = url;
        return response;
    }
}
}

comment if you face any issue in the class.

这篇关于如何创建和删除边缘属性(泰坦1.0)在.net mvc中使用C#?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆