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

Azure cosmosdb 以编程方式遍历多个顶点时,使用“顶点”属性值创建边,azure-cosmosdb,gremlin,Azure Cosmosdb,Gremlin,我发现,当从DB或任何格式(以关系作为列键)将数据导入图形时,我需要使用这些键创建边,这些键已经是顶点中的属性 如何通过使用这些我已经摄取到图形中的FK来遍历所有顶点以创建边 我需要以编程的方式实现这一点,因为我有很多数据需要这一步。目前我使用的是Gremlin.Net,因为我使用的大多数代码都是C# 例如: 想象一下,我吞下了一些顾客 g、 addV('customer')。属性('id',c_id)。属性('product',product_id) 还有一些产品 g、 addV(“产品”)。

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

如何通过使用这些我已经摄取到图形中的FK来遍历所有顶点以创建边

我需要以编程的方式实现这一点,因为我有很多数据需要这一步。目前我使用的是Gremlin.Net,因为我使用的大多数代码都是C#

例如: 想象一下,我吞下了一些顾客

g、 addV('customer')。属性('id',c_id)。属性('product',product_id)

还有一些产品

g、 addV(“产品”)。属性(“id”,产品id)

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

我想做一些类似的事情:

g、 V.hasLabel(‘客户’)。as(‘c’)。将(‘购买’)添加到(g.V(c.产品))

显然我不能做
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,这将是一个昂贵的操作,具体取决于您拥有的数据量


当关系的知识已知时,最好生成边。因此,如果您在某一点上知道“ProductBunded”存在,那么它不应该作为“ProductBunded”属性键加载,而是作为“product”顶点的边加载。在模式设计中提前做出这些选择将为以后节省很多困难。

谢谢,我认为这可以让我开始,虽然这看起来是一个非常昂贵的操作。至于你的评论,该图不是我的真实来源,我有大量具有多个关系的预先存在的数据,其中一些不容易查询,因此我无法在所有边都到位的情况下一次加载50多个顶点。我认为这是一种常见的情况,因为几乎没有人会想到首先从一个图开始。但考虑到其中一个优势应该是人际关系,我惊讶地发现,很难做到这一点。图表旨在强调人际关系,而且边缘清晰。在属性上进行连接就是将图形视为关系数据存储,当这种情况发生时,查询通常代价高昂,因为您放弃了图形最宝贵的方面——实体之间通过它们之间的链接进行的直接连接。所以,你所做的并不是一个普通的场景。刚才gremlin用户邮件列表上的某个人甚至说“连接”模式——这永远不应该使用:我不确定我是否理解为什么不能加载带有边的顶点。无论您有多少数据源,我都认为可以通过清晰的模式设计,然后在加载到图表之前进行适当的数据分段来缓解问题。这与我的数据的复杂性以及我不是从零开始这一事实有很大关系,我想让图形作为一种方式来完成在关系模型中非常昂贵的工作,即遍历关系。当我在图中加载数据时(来自其他地方,如sql、mongodb、json blobs,你可以说),从属性派生边的操作将不太常见。我确实尝试过这种方法,但是我必须添加的数据、关系和验证的数量太多了,而且我希望我不必假设我的模式必须永远保持静态。虽然随着项目的发展,会出现一些新的关系,因此可以与较新的顶点一起被吸收,但对我们来说最有趣的是我们可以从数据中获得的关系,这里是我需要再次基于属性构建边的地方。如果没有这种能力,我想我可能想在我的关系创建和遍历搜索中寻找其他地方。