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



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

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

我需要以编程方式做到这一点,因为我有很多需要这一步的数据。目前我正在使用 Gremlin.Net 因为我使用的大部分代码已经是 C#

例: 想象一下,我摄取了一些客户

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

和一些产品

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

我想创建这样的边缘:客户[买>项目] 如何使用 ID 创建边? 我似乎无法在其顶点的上下文中引用属性。

我想做这样的事情:

g.V.hasLabel('customer'(.as('c'(.

addE('bbuy'(.to(g.V(c.product((

显然我不能做c.product,如果有任何使用循环的解决方案,可悲的是这是不可能的,因为 Cosmos Graph 不支持它。

到目前为止,我一直在诉诸 C# 循环,但即使是我的示例数据也无法缩放。

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

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]

上面的概念在某种程度上是基于"遍历诱导值",这里对此进行了更详细的描述。

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

当知道关系知识时,最好生成边。因此,如果您在某一时刻知道"productBought"存在,那么它不应该作为"productBought"属性键加载,而应该作为"产品"顶点的边加载。在模式设计中预先做出这些类型的选择将在以后节省很多困难。

最新更新