首页 > 解决方案 > 如何在 gremlin.net 中更新/添加顶点属性

问题描述

我想通过以下函数添加/更新顶点属性到 janusgraph 与 Gremlin.Net version=3.4.6; JanusGraph.Net 版本=0.2.2

    public class DataManager
    {
        private readonly IGremlinClient client;

        private readonly GraphTraversalSource g;

        public DataManager()
        {
            this.client = JanusGraphClientBuilder
                .BuildClientForServer(new GremlinServer("localhost", 8182))
                .Create();
            this.g = AnonymousTraversalSource.Traversal().WithRemote(
                new DriverRemoteConnection(this.client));
        }

        public async Task EditVertexProperty(VertexDto vertexDto)
        {
            var traversal = this.g.V(vertexDto.Id);
            if (!string.IsNullOrWhiteSpace(vertexDto.Label))
            {
                traversal = traversal.HasLabel(vertexDto.Label);
            }

            if (!traversal.HasNext())
            {
                throw new Exception("xxxxxxx");
            }

            foreach (var property in vertexDto.Properties)
            {
                if (property.IsList)
                {
                    traversal = traversal.Property(Cardinality.List, property.PropertyKey, property.PropertyValue);
                }
                else
                {
                    traversal = traversal.Property(Cardinality.Single, property.PropertyKey, property.PropertyValue);
                }
            }

            await traversal.Promise(v => v.Iterate()).ConfigureAwait(false);
        }
    }

    public class VertexDto
    {
        public string Id { get; set; }
        public string Label { get; set; }
        public List<Property> Properties { get; set; }
    }

    public class Property
    {
        public string PropertyKey { get; set; }
        public string PropertyValue { get; set; }
        public bool IsList { get; set; }
    }

当我尝试添加或更新顶点属性时,例如,

{
    "id": 1234,
    "properties":[
        {
            "propertyKey": "name",
            "propertyValue": "sb"
        }
    ]
}

但没有任何改变,也没有抛出异常。我尝试在 gremlin-server 中使用 gV(1234).property("name", "sb").iterate() 它有效。首先我认为当调用 HasNext() 时遍历会停止,但这似乎并非如此。

我该怎么办。感谢您的帮助。

标签: .net-coregremlinjanusgraphgremlinnet

解决方案


使用遍历的方法是首先通过连接您要执行的步骤(如 等)迭代地构建它V()has()然后使用将执行遍历的终端步骤iterate()终止遍历。

但是,您在示例中使用了两个无效的终端步骤。首先,您执行HasNext()以验证顶点是否存在,然后您尝试修改其属性,然后您希望通过Iterate(). 然而,遍历已经被评估并且它的字节码在你执行时被发送到服务器HasNext()。之后不可能再调制遍历对象。

当您尝试在 Gremlin 控制台中执行相同操作时,这一点会变得更加清晰:

gremlin> t = g.V().has('name','peter'); []
gremlin> t.hasNext()
==>true
gremlin> t.property('test','test').iterate()
The traversal strategies are complete and the traversal can no longer be modulated

因此,Gremlin-Java 抛出异常以明确表示这是不可能的。不幸的是,Gremlin.NET 不会抛出异常,只是在执行后忽略任何添加到遍历的步骤。如果 Gremlin.NET 也抛出异常以使这一点更清楚,那当然会更好。我使用 TinkerPop 项目为此创建了一张票:TINKERPOP-2614

所以,如果你想在修改它的属性之前首先检查顶点是否存在,那么你必须创建两个不同的遍历。


推荐阅读