Graph databases CosmosDB图顶点和边的划分键

Graph databases CosmosDB图顶点和边的划分键,graph-databases,azure-cosmosdb,Graph Databases,Azure Cosmosdb,我正在创建一个图,最初使用的分区键似乎是给定数据集的唯一逻辑键。但是,对于单个分区来说,顶点和边的数量太多。我还没有创建分区集合,只是创建了一个10GB集合。我把这个空间用完了,把它填满了,因为我不确定有多少个顶点和边。数据是一组具有不同数量的子类别(以及这些子类别的子类别的任意深度)的类别。数据是类别id和名称以及该类别适用的市场。分区密钥目前正在市场上销售。在一个给定的市场中,有许多类别/子类别/子类别/。。。这耗尽了给定市场的10GB分区 如果我所拥有的只是一个唯一的类别id、一个类别名称

我正在创建一个图,最初使用的分区键似乎是给定数据集的唯一逻辑键。但是,对于单个分区来说,顶点和边的数量太多。我还没有创建分区集合,只是创建了一个10GB集合。我把这个空间用完了,把它填满了,因为我不确定有多少个顶点和边。数据是一组具有不同数量的子类别(以及这些子类别的子类别的任意深度)的类别。数据是类别id和名称以及该类别适用的市场。分区密钥目前正在市场上销售。在一个给定的市场中,有许多类别/子类别/子类别/。。。这耗尽了给定市场的10GB分区

如果我所拥有的只是一个唯一的类别id、一个类别名称和一个市场(作为顶点),然后边的parentOf将父类别连接到其子类别,那么作为分区键还有什么意义呢?如果我有一个id为1的父类别(顶点),一个“US”市场,它有100个子类别,每个子类别都有自己的id,并且父类别连接对应的100条边都有相同的“US”市场,那么对于除市场之外的分区键,我唯一的其他选项就是类别id。问题是,如果这些子级(和边)的子级和子级位于其他分区中,查找和遍历的效率如何

如何使用这样的场景构建一个非常大的图

给定任意类别id,查找所有子级并向下遍历边以查找这些边层次结构中的所有子级时,性能会如何

边的分区键属性需要是什么?与父顶点相同的分区键,还是与子顶点相同的分区键


我的想法是错误的吗?

对于任何非平凡的图形实现,我的建议是创建一个所有文档都必须包含的超级通用属性,例如(相当确切地说)
partitionKey
。然后,您可以在有意义的字段中自由使用
market
的值,并使用其他内容来支持不同的查询模式

需要了解的重要一点是,跨多个分区的查询速度会很慢。因此,您应该尽可能地调整分区密钥,以支持读写之间的最佳平衡

问问自己“我最经常需要对这些数据执行哪些查询?”然后相应地调整各种文档的partitionKey


至于边,当您使用Gremlin在两个顶点之间添加边时,Cosmos会自动将边文档放置在与输出顶点相同的分区中。

Jesse,我对您的最后一句话很好奇。我一直在使用Document db REST API查询Graph db,边和顶点是独立的文档。看起来它们不像GraphDb SDK返回的GraphSON那样组合在一起。另外,通过Fiddler查看.NET SDK中的GraphDb调用,看起来Gremlin查询被分解为许多DocumentDb查询,返回顶点或边。是的,边和顶点被存储为完全独立的文档,GraphDb SDK按照您观察到的方式在客户端合成查询结果。我的最后一句话只是讨论了使用gremlin创建边缘时,边缘文档将放置在哪个分区中。当执行
g.V().has('id','jesse').addE('knows').to(g.V().has('id','michael'))
时,将创建一个新的边缘文档,但它将放置在与本例中的jesse顶点相同的逻辑分区中。