如何 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.
所以,如果你想在修改它的属性之前先检查顶点是否存在,那么你必须创建两个不同的遍历。
我想 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.
所以,如果你想在修改它的属性之前先检查顶点是否存在,那么你必须创建两个不同的遍历。