无法在Titan 1.0 Tinkerpop 3上删除/移除多个属性键

7

非常基础的问题,
我刚将我的Titan升级从0.54到。

我遇到一个删除数值的问题。

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]

有什么想法吗?

1
虽然这是一个带有 neo4j 标签的 Titan 相关问题,但读者应该知道所提出的答案适用于 Neo4j。 - jbmusso
2个回答

11

您没有使用更高级别的Gremlin API来执行图遍历,而是正在使用较低级别的图API对图进行更改。在Gremlin中使用for循环通常是反模式。

根据TinkerPop 3.0.1 Drop Step文档,您可以从Gremlin控制台执行以下操作:

v = g.addV().next()
g.V(v).property("myList", "role1")
g.V(v).property("myList", "role2")
// ...
g.V(v).properties('myList').drop()

关于删除键的JavaDoc中需要注意的一些事项:“从图中删除元素和属性。这一步不是终止操作,因为它不会自动迭代遍历。因此,必须进行某种形式的迭代才能实际执行删除操作。在大多数情况下,最好使用g.V().drop().iterate()来完成迭代。” 请参见此处 - Lyndon Armitage

2

property(key, value)函数将会在顶点上设置属性的值(javadoc)。你需要做的是获取顶点属性(javadoc)。

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

@jbmusso提供了一个稳定的解决方案,使用了GraphTraversal


感谢两个解决方案都有效,但由于我的Titan升级,我有很多类似于TP2的旧代码, 现在我不知道是否应该用“遍历”替换所有基本查询的代码,例如:“tg.query().has(NODE_TYPE,NodeType.USER.name())。vertices() ...等”,我有点困惑什么更好的性能? 何时需要使用“遍历”功能...非常感谢。 - VitalyT
1
请在编写查询时优先考虑可维护性和表达能力,而非性能。尽量使用遍历操作。遍历操作还具有内置的优化策略,可以免费启用,因此我认为您无需担心可能存在的遍历开销。 - jbmusso
2
我同意@jbmusso的观点,而且我还建议你迁移到TinkerPop 3遍历API(而不是Titan query()),因为这样做会使你在选择不同的图形后端时更加灵活。 - Jason Plurad
感谢回答,但我不明白"tg.traversal()"到底是做什么的,以及我需要多久执行一次?它是否保持对所有图形节点(顶点、边缘)的实时引用?或者每次当我需要与数据库交互(检索数据或更新新节点)时,再次进行tg.traversal()调用...似乎这个调用会一遍又一遍地遍历整个图形...也许我只需要在服务器的初始调用中遍历一次,并在运行期间使用该引用来初始化traversal()..?敬礼 :) - VitalyT
你应该创建遍历对象并重复使用它 -- TitanGraph graph = TitanFactory.open('conf/titan.properties'); GraphTraversalSource g = graph.traversal(); -- 在 TinkerPop 文档中了解更多信息 http://tinkerpop.apache.org/docs/3.0.2-incubating/#_the_graph_process - Jason Plurad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接