无法在 Vertex Titan 1.0 Tinkerpop 3 上 delete/remove 多个 属性 键
Can't delete/remove multiple property keys on Vertex Titan 1.0 Tinkerpop 3
非常基本的问题,
我刚刚将我的 Titan 从 0.54 升级到 Titan 1.0 Hadoop 1 / TP3 版本 3.01.
我在删除
的值时遇到问题
Property key: Cardinality.LIST/SET
可能是升级过程的问题,或者是我对TP3的误解。
// ----- CODE ------:
tg = TitanFactory.open(c);
TitanManagement mg = tg.openManagement();
//create KEY (Cardinality.LIST) and commit changes
tm.makePropertyKey("myList").dataType(String.class).cardinality( Cardinality.LIST).make();
mg.commit();
//add vertex with multi properties
Vertex v = tg.addVertex();
v.property("myList", "role1");
v.property("myList", "role2");
v.property("myList", "role3");
v.property("myList", "role4");
v.property("myList", "role4");
现在,我想删除所有值"role1,role2...."
// iterate over all values and try to remove the values
List<String> values = IteratorUtils.toList(v.values("myList"));
for (String val : values) {
v.property("myList", val).remove();
}
tg.tx().commit();
//---------------- THE EXPECTED RESULT ----------:
Empty vertex properties
但不幸的是结果不是空的:
System.out.println("Values After Delete" + IteratorUtils.toList(v.values("myList")));
//---------------- 输出 --------------:
删除后,值仍然明显!
15:19:59,780 INFO ThriftKeyspaceImpl:745 - Detected partitioner org.apache.cassandra.dht.Murmur3Partitioner for keyspace titan
15:19:59,784 INFO Values After Delete [role1, role2, role3, role4, role4]
有什么想法吗?
您没有使用更高级别的 Gremlin API 执行图遍历,但您当前正在使用较低级别的图 API 改变图。在 Gremlin 中执行 for
循环通常是一种反模式。
根据 TinkerPop 3.0.1 Drop Step documentation,您应该能够从 Gremlin 控制台执行以下操作:
v = g.addV().next()
g.V(v).property("myList", "role1")
g.V(v).property("myList", "role2")
// ...
g.V(v).properties('myList').drop()
property(key, value)
将 设置 顶点 (javadoc). What you should do is get the VertexProperties (javadoc) 上 属性 的值。
for (VertexProperty vp : v.properties("name")) {
vp.remove();
}
@jbmusso 提供了一个使用 GraphTraversal
的可靠解决方案。
非常基本的问题,
我刚刚将我的 Titan 从 0.54 升级到 Titan 1.0 Hadoop 1 / TP3 版本 3.01.
我在删除
的值时遇到问题Property key: Cardinality.LIST/SET
可能是升级过程的问题,或者是我对TP3的误解。
// ----- CODE ------:
tg = TitanFactory.open(c);
TitanManagement mg = tg.openManagement();
//create KEY (Cardinality.LIST) and commit changes
tm.makePropertyKey("myList").dataType(String.class).cardinality( Cardinality.LIST).make();
mg.commit();
//add vertex with multi properties
Vertex v = tg.addVertex();
v.property("myList", "role1");
v.property("myList", "role2");
v.property("myList", "role3");
v.property("myList", "role4");
v.property("myList", "role4");
现在,我想删除所有值"role1,role2...."
// iterate over all values and try to remove the values
List<String> values = IteratorUtils.toList(v.values("myList"));
for (String val : values) {
v.property("myList", val).remove();
}
tg.tx().commit();
//---------------- THE EXPECTED RESULT ----------: Empty vertex properties
但不幸的是结果不是空的:
System.out.println("Values After Delete" + IteratorUtils.toList(v.values("myList")));
//---------------- 输出 --------------:
删除后,值仍然明显!
15:19:59,780 INFO ThriftKeyspaceImpl:745 - Detected partitioner org.apache.cassandra.dht.Murmur3Partitioner for keyspace titan
15:19:59,784 INFO Values After Delete [role1, role2, role3, role4, role4]
有什么想法吗?
您没有使用更高级别的 Gremlin API 执行图遍历,但您当前正在使用较低级别的图 API 改变图。在 Gremlin 中执行 for
循环通常是一种反模式。
根据 TinkerPop 3.0.1 Drop Step documentation,您应该能够从 Gremlin 控制台执行以下操作:
v = g.addV().next()
g.V(v).property("myList", "role1")
g.V(v).property("myList", "role2")
// ...
g.V(v).properties('myList').drop()
property(key, value)
将 设置 顶点 (javadoc). What you should do is get the VertexProperties (javadoc) 上 属性 的值。
for (VertexProperty vp : v.properties("name")) {
vp.remove();
}
@jbmusso 提供了一个使用 GraphTraversal
的可靠解决方案。