【问题标题】:Can't delete/remove multiple property keys on Vertex Titan 1.0 Tinkerpop 3无法删除/删除 Vertex Titan 1.0 Tinkerpop 3 上的多个属性键
【发布时间】:2016-08-01 16:05:21
【问题描述】:

非常基本的问题,
我刚刚将我的 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();

//---------------- 预期结果 ----------: 空顶点属性

但不幸的是结果不是空的:

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]

有什么想法吗?

【问题讨论】:

  • 虽然 Titan 相关问题带有 neo4j 标签,但应告知读者建议的答案适用于 Neo4j

标签: titan gremlin tinkerpop tinkerpop3


【解决方案1】:

property(key, value)设置顶点属性的值 (javadoc)。您应该做的是获取 VertexProperties (javadoc)。

for (VertexProperty vp : v.properties("name")) {
    vp.remove();
}

@jbmusso 提供了一个使用GraphTraversal 的可靠解决方案。

【讨论】:

  • 感谢这两种解决方案都有效,但是因为我的 Titan 升级我有很多类似于 TP2 的遗留代码,现在我不知道用“遍历”而不是基本代码替换所有代码是否更好像这样的查询:“tg.query().has(NODE_TYPE, NodeType.USER.name()).vertices() ....,etc'”我有点困惑什么对性能更好?当我需要使用“遍历”功能时......非常感谢
  • 优先考虑查询的可维护性和表达性而不是性能,并尽可能多地使用遍历。遍历也有内置的优化策略,可以免费使用,我认为你不应该担心遍历开销,如果有的话。
  • 我同意@jbmusso,另外我还建议您迁移到 TinkerPop 3 遍历 API(而不是 Titan query()),因为如果您决定选择一个不同的图形后端。
  • 感谢您的回答,但我不明白“tg.traversal()”究竟是做什么的,我需要多久执行一次? ,它是否保持对所有图形节点(顶点、边)的实时引用?或者每次我需要与数据库交互(检索数据或更新新节点)时再次调用 tg.traversal() ......,似乎这个调用一次又一次地遍历所有图......也许我需要遍历仅在服务器的 init 调用中一次,并且在运行期间使用对 init traversal() 的引用..? BR :)
  • 您应该创建一次遍历对象并重用它 -- TitanGraph graph = TitanFactory.open('conf/titan.properties'); GraphTraversalSource g = graph.traversal(); -- 在 TinkerPop 文档中了解更多信息tinkerpop.apache.org/docs/3.0.2-incubating/#_the_graph_process
【解决方案2】:

您没有使用更高级别的 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()

【讨论】:

  • JavaDoc 关于删除键的注意事项:“从图中删除元素和属性。这一步不是终止,因为它不会自动迭代遍历。因此必须进行某种形式的迭代才能实际发生删除。在大多数情况下,最好使用 gV().drop().iterate() 完成迭代。见here
猜你喜欢
  • 2023-03-05
  • 2016-12-01
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多