【问题标题】:How to update/add vertex properties in gremlin.net如何在 gremlin.net 中更新/添加顶点属性
【发布时间】:2021-10-31 23:56:39
【问题描述】:

我想通过以下函数向 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).property("name", "sb").iterate() 它有效。 首先我认为调用 HasNext() 时遍历停止,但似乎并非如此。

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

【问题讨论】:

  • 您能否将您的代码清单缩减为仍然显示问题的最小示例? await g.V(1234).Property("name", "sb").Promise(t =&gt; t.Iterate()); 应该可以工作,然后你只需要像你一样创建GraphTraversalSource g。如果您像这样简化代码,它仍然会失败吗?
  • @FlorianHockmann 嗨 Florian Hockmann,正如你所说,await g.V(1234).Property("name", "sb").Promise(t =&gt; t.Iterate()); 它可以工作,我发现问题是在调用 HasNext() 时引起的。当我删除 if (!traversal.HasNext()) {...} 或在 if 语句下创建一个新的遍历时,if (!traversal.HasNext()) {...} var newTraversal = this.g.V(vertexDto.Id); ... 它起作用了。为什么会这样,我该如何避免呢?
  • 好的,那我想我知道问题出在哪里了。我将其发布为答案。希望对您有所帮助。

标签: .net-core gremlin janusgraph gremlinnet


【解决方案1】:

使用遍历的方法是首先通过连接您要执行的步骤(如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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-25
    • 2016-05-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多