如何确保给定 order_id 的图中有单边?
how to ensure there single edge in a graph for a given order_id?
我目前的情况就像我有 products,customer 和 seller 节点在我的图表生态系统中。我面临的问题是我必须确保
的唯一性
(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)
- 我应该如何确保给定单次购买优势的唯一性
order_item_id。 (我没有一个用例来搜索基于
order_item_id.)
- 在边上使用创建索引的基本区别是什么
buildIndex 并使用 buildEdgeIndex?
您不能在边缘级别强制属性的唯一性,即。在两个顶点之间(参见 this question on the mailing list)。如果我正确理解您的问题,即使您不打算按索引 属性.但是,当由于锁定而同时插入许多边时,这可能会导致性能问题。根据插入数据的速率,您可能必须跳过锁定(= 跳过唯一性约束)并冒重复边的风险,然后在读取时自行处理重复数据删除 and/or 运行 post-导入批处理作业以清理潜在的重复项。
buildIndex()
构建一个全局图形索引(CompositeIndex
或 MixedIndex
)。这些类型的索引通常允许您在图表中快速找到 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.
我目前的情况就像我有 products,customer 和 seller 节点在我的图表生态系统中。我面临的问题是我必须确保
的唯一性
(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)
- 我应该如何确保给定单次购买优势的唯一性 order_item_id。 (我没有一个用例来搜索基于 order_item_id.)
- 在边上使用创建索引的基本区别是什么 buildIndex 并使用 buildEdgeIndex?
您不能在边缘级别强制属性的唯一性,即。在两个顶点之间(参见 this question on the mailing list)。如果我正确理解您的问题,即使您不打算按索引 属性.但是,当由于锁定而同时插入许多边时,这可能会导致性能问题。根据插入数据的速率,您可能必须跳过锁定(= 跳过唯一性约束)并冒重复边的风险,然后在读取时自行处理重复数据删除 and/or 运行 post-导入批处理作业以清理潜在的重复项。
buildIndex()
构建一个全局图形索引(CompositeIndex
或MixedIndex
)。这些类型的索引通常允许您在图表中快速找到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.