.net-core - 如何在 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() 时遍历会停止,但这似乎并非如此。
我该怎么办。感谢您的帮助。
解决方案
使用遍历的方法是首先通过连接您要执行的步骤(如 等)迭代地构建它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。
所以,如果你想在修改它的属性之前首先检查顶点是否存在,那么你必须创建两个不同的遍历。
推荐阅读
- python - 我正在尝试制作一个程序来跟踪用户提供的字符串中最常见的字符。我在这里做错了什么?
- angular - 类型'可观察的
' 不可分配给类型 'Observable ' - python - Anaconda TensorFlow 安装错误“HTTP”如何修复?
- ios - AppCenter react native ios build失败:“以下构建命令失败:CopyPlistFile”
- amazon-web-services - 如何为 Appsync 中的每个字段附加解析器并在之后查询
- python - 可重用 WebDriverWait 问题“对象没有属性‘驱动程序’”
- python - Add2LinkedList -- 给出 SyntaxError: Missing parentheses in call to 'print'
- python - 将一些参数从命令行直接传递给 matplotlib
- node.js - 如何在 sequelize 中使用 beforeBulkCreate 挂钩加密密码
- c# - 如何在 Quartz.net 中创建工作?