如何在Titan数据库中覆盖顶点ID?

3

我正在使用一个生成对象Node的框架,它们已经分配了一个ID。现在需要将它们转换为具有相同ID的Titan顶点,并在框架中进行控制(通过node.id访问)。

public long addNode(Node node) {    
   TitanVertex vertex = (TitanVertex) g.addVertex(null);
   g.commit();

   vertex.setProperty(ID, node.id);
   vertex.setProperty(TYPE, node.type);
   vertex.setProperty(VERSION, node.version);
   vertex.setProperty(TIME, node.time);
   vertex.setProperty(DATA, node.data);
   ...

错误:

java.lang.IllegalArgumentException: Name is reserved: id

但是似乎不允许这样做。我应该使用一些虚假属性来模拟二级ID吗?Titan是否有实现这个的方法?
谢谢!
2个回答

8

很少有图形数据库允许您设置元素标识符。无论您使用Neo4j、OrientDB、Titan等,它们都倾向于拥有自己的ID系统。TinkerGraph实际上是唯一允许ID分配的Blueprints实现。

如果您想保留您的ID,则应将其重命名为其他名称。例如,您可以使用"iid"代替"id"。从编程角度更透明的做法是考虑使用IdGraph包装器,这将使您可以执行以下操作:

gremlin> base = TitanFactory.open('/tmp/titan-berkley')
==>titangraph[local:/tmp/titan-berkley]
gremlin> g = new IdGraph(base, true, false)            
==>idgraph[titangraph[local:/tmp/titan-berkley]]
gremlin> g.addVertex(45)  
==>v[45]
gremlin> g.v(45)
==>v[45]

你可以看到,IdGraph让它看起来好像你正在分配元素ID本身。实际上,在幕后它只是使用关键索引。

1
如果您需要在没有关键索引的情况下工作,则创建一个除“id”(例如“iid”)之外的属性名称。您没有提到您的基准是什么,但在没有关键索引的情况下,使用“iid”进行查找将最终成为线性扫描,并且结果可能相当糟糕。我假设您所问的问题与Titan存储关键索引本身有关。如果是这样,此链接可能会有所帮助:https://github.com/elffersj/delftswa-aurelius-titan/blob/master/SA-doc/Mapping.md - stephen mallette
如果您想在边缘上使用自定义ID,也就是IdGraph(base, true, true),那么您可能需要先创建__id属性,在0.3.0版本中我需要它。https://github.com/thinkaurelius/titan/issues/179 - Gonfi den Tschal
在图上进行正常的索引查找时,您不会看到任何性能惩罚,与在图上执行常规索引查找相比(在大多数情况下,您必须执行此操作才能在图中查找某些内容,因为您可能不会方便地拥有分配给该内容的图形ID)。 - stephen mallette
哦,我找到了另一种解决方案:g.getVertices("vid", "id123");。我认为这对Titan来说更加自然。这里的vid将是顶点的ID。 - Manish Kumar
2
IdGraph 基本上就是这样做的,它使用一个键索引来查找顶点。因此,当您执行 g.getVertex("id123") 时,它知道要引用 "vid",从而使您无需输入它。 - stephen mallette
显示剩余4条评论

1

@Stephen,无法确定关于 gremlin 终端的情况,但是通过 Titan Java API 尝试了一下,没有成功。即使在创建 id 图中的顶点时传递了 id,节点仍然被分配了默认 id。


我有同样的问题,TitanGraph实例无法作为IdGraphbase参数传递 :/ - Jiri Kremser

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