如何 update/add gremlin.net 中的顶点属性

How to update/add vertex properties in gremlin.net

我想 add/update 通过以下函数将顶点属性添加到 janusgraph 中 Gremlin.Net版本=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 中尝试使用 g.V(1234).属性("name", "sb").iterate() 它有效。 首先我认为遍历在调用 HasNext() 时停止,但事实并非如此。

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

处理遍历的方法是首先通过连接要执行的步骤(如 V()has() 等)迭代构建它,然后终止遍历使用 terminal step 遍历 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.

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