以编程方式遍历多个顶点时,请使用顶点属性值创建边

时间:2018-10-13 09:38:26

标签: azure-cosmosdb gremlin

我发现,当从数据库或与我有关系作为列键的任何格式的图形中将数据导入图形时,我需要使用这些键(已经是顶点的属性)创建Edges。

如何使用已经摄取到图中的这些FK遍历所有创建Edge的顶点?

并且我需要以编程方式实现此目标,因为在需要执行此步骤的地方,我有很多数据。目前,我正在使用Gremlin.Net,因为我使用的大多数代码已经是C#

示例: 想象一下,我已经吸收了一些顾客

  

g.addV('customer')。property('id',c_id).property('product',product_id)

还有一些产品

  

g.addV('product')。property('id',product_id)

我想创建诸如以下的边:服装[bought->项目] 如何使用ID创建边缘? 我似乎无法在其顶点的上下文中引用属性。

我想做类似的事情:

  

g.V.hasLabel('customer')。as('c')。addE('bought')。to(g.V(c.product))

很明显,我无法执行c.product,并且如果有使用循环的解决方案,那么很遗憾,这是不可能的,因为Cosmos Graph不支持它。

到目前为止,我一直在使用C#循环,但是即使我的示例数据也无法扩展。

1 个答案:

答案 0 :(得分:1)

也许有更好的方法可以做到这一点,但我会提供:

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('customer').property('id', 321).property('productBought', 123)
==>v[0]
gremlin> g.addV('product').property('id', 123)
==>v[3]
gremlin> g.addV('customer').property('id', 987).property('productBought', 789)
==>v[5]
gremlin> g.addV('product').property('id', 789)
==>v[8]
gremlin> g.V().hasLabel('customer').as('c').
......1>   V().hasLabel('product').as('p').
......2>   where('p', eq('c')).
......3>     by('id').
......4>     by('productBought').
......5>   select('p').
......6>   addE('buys').from('c').to('p')
==>e[10][0-buys->3]
==>e[11][5-buys->8]

以上概念在某种程度上基于here更详细地描述的“遍历感应值”。

最近,我看到了很多问题,都在问这样的问题-人们想要在没有边缘的情况下进行联接(即在顶点属性值上联接)。那里不是图形查询大放异彩的地方,对于Gremlin的大多数实现(可能还有CosmosDB),这将是一个昂贵的操作,具体取决于您拥有的数据量。

当了解关系的知识时,最好生成边缘。因此,如果您某一时刻知道“ productBought”存在,则不应将其作为“ productBought”属性键加载,而应作为“ product”顶点的边缘加载。在模式设计中预先进行这些选择会在以后节省很多麻烦。