如何确保给定 order_id 的图中有单边?

how to ensure there single edge in a graph for a given order_id?

我目前的情况就像我有 products,customerseller 节点在我的图表生态系统中。我面临的问题是我必须确保

的唯一性

(customer)-[buys]->product

with order_item_id as 属性 of the buys relation edge.I have to ensure that对于给定的 order_item_id,购买 属性 有一个独特的优势。通过这种方式,我想确保我的图形插入保持幂等,并且不会为给定的 order_item_id.

创建重复购买边

创建 order_item_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.getOrCreateEdgeLabel("product"),"uniqueOrderItemId",Direction.BOTH,order_item_id)

您不能在边缘级别强制属性的唯一性,即。在两个顶点之间(参见 this question on the mailing list)。如果我正确理解您的问题,即使您不打算按索引 属性.但是,当由于锁定而同时插入许多边时,这可能会导致性能问题。根据插入数据的速率,您可能必须跳过锁定(= 跳过唯一性约束)并冒重复边的风险,然后在读取时自行处理重复数据删除 and/or 运行 post-导入批处理作业以清理潜在的重复项。

  • buildIndex() 构建一个全局图形索引(CompositeIndexMixedIndex)。这些类型的索引通常允许您在图表中快速找到 Traversal 的起点。
  • 但是,buildEdgeIndex() 允许您构建本地,“vertex-centric index" which is meant to speed-up the traversal between vertices with a potentially high degree (= huge number of incident edges, incoming and/or outgoing). Such vertices are called "super nodes" (see A solution to the supernode problem blog post from Aurelius) - 尽管它们往往非常罕见,但遍历它们的可能性并不低。

参考:Titan documentation, Ch. 8 - Indexing for better Performance.