Graph 如何确保给定顺序的图中有一条边?

Graph 如何确保给定顺序的图中有一条边?,graph,unique,titan,gremlin,edges,Graph,Unique,Titan,Gremlin,Edges,我当前的场景就像我的图形生态系统中有产品、客户和卖家节点一样。我面临的问题是,我必须确保 (客户)-[购买]->产品 使用order\u item\u id作为buys关系边的属性。我必须确保对于给定的order\u item\u id,有一个具有buys属性的唯一边。这样,我希望确保我的图插入保持幂等性,并且不会为给定的order\u item\u id创建重复的buys边 创建订单\u项目\u id属性 if(!mgmt.getPropertyKey("order_item_id")){

我当前的场景就像我的图形生态系统中有产品客户卖家节点一样。我面临的问题是,我必须确保

(客户)-[购买]->产品

使用order\u item\u id作为buys关系边的属性。我必须确保对于给定的order\u item\u id,有一个具有buys属性的唯一边。这样,我希望确保我的图插入保持幂等性,并且不会为给定的order\u item\u id创建重复的buys边

创建订单\u项目\u id属性

if(!mgmt.getPropertyKey("order_item_id")){
    order_item_id=mgmt.makePropertyKey("order_item_id").dataType(Integer.class).make();
}else{
    order_item_id=mgmt.getPropertyKey("order_item_id");
} 
到目前为止,我发现构建唯一索引可能会解决我的问题。像

if(mgmt.getGraphIndex('order_item_id')){
    ridIndexBuilder=mgmt.getGraphIndex('order_item_id')
}else{
    ridIndexBuilder=mgmt.buildIndex("order_item_id",Edge.class).addKey(order_item_id).unique().buildCompositeIndex();
}
或者我也可以用

mgmt.buildEdgeIndex(graph.getorCreatedgeLabel(“产品”),“uniqueOrderItemId”,Direction.BOTH,order\u item\u id)

  • 我应该如何确保单一优势在给定条件下的唯一性 order\u item\u id。(我没有基于的用例进行搜索。) 订单\项目\标识。)
  • 使用创建边缘索引的基本区别是什么 buildIndex并使用buildEdgeIndex

无法在边级别强制特性的唯一性,即在两个顶点之间(请参见)。如果我正确理解了您的问题,那么在边上为给定属性构建具有唯一性约束的
CompositeIndex
应该可以解决您的问题,即使您不打算通过索引属性搜索这些边。但是,由于锁定,在同时插入多条边时,这可能会导致性能问题。根据插入数据的速率,您可能必须跳过锁定(=跳过唯一性约束)并冒重复边缘的风险,然后在读取时自行处理重复数据消除和/或运行导入后批处理作业以清除潜在的重复

  • buildIndex()。这类索引通常允许您在图形中快速找到
    遍历的起点
  • 但是,
    buildEdgeIndex()
    允许您构建一个本地节点“”,这意味着加速顶点之间的遍历,可能会(=大量的事件边、传入和/或传出)。这样的顶点被称为“超级节点”(请参阅),尽管它们往往非常罕见,但遍历它们的可能性并不低

参考:。

再次感谢您提供的详细信息。性能问题是否严重到我们可以跳过锁定并危及数据库一致性?即使我不需要titan db的实时结果,是否也存在性能缺陷?重锁插入会对读取查询产生影响吗?性能问题实际上取决于图形的大小和插入数据的速率。在scale中,您很可能总是希望避免锁定以保持快速写入性能。如果你真的关心速度,我认为最好设置一个性能测试,有锁和没有锁,看看你能得到什么样的读写性能。我提出了预插入检查,它帮助我跳过在边缘上建立索引。它在创建边缘之前检查特定边缘的存在。但我仍然无法消化为了速度而松开锁(可能是我的酸根)。我认为进口后的工作开销会很大。在插入顶点的情况下,释放锁是否也可以接受?