理解泰坦遍历

Understanding Titan Traversals

我正在尝试使用 titandb 编写一个高度可扩展的系统。我有一些节点高度连接的情况。 想象一下以下规模更大的示例。

现在我有以下几种情况:

  1. 我想找到节点X的所有好友。
  2. 我想找到节点 X 的特定朋友,例如 5.

对于场景 1,我这样做:g.V(X).out(friend).toList()。对于场景 2,我这样做:g.V(X).out(friend).hasId(5).next()。这两种遍历都可以工作,但随着 X 获得更多朋友,扩展性会很差。我可以通过在边缘标签上放置更多信息来优化这种情况吗?例如,如果在 X5 之间的边缘,我将标签更改为 freind_with_5 以下内容会更快:

`g.V(X).out(freind_with_5).next()`

根据我的理解,这会更快,因为只会遍历 1 个边。但是,如果我对边缘标签进行这样的更改,我将如何找到 X 的所有朋友?

您可以将数据编码到您的边缘标签中,但我会说这样做的代价是使您的图形模式变得相当复杂,并且正如您所指出的那样,很难做像 "find all my friends" 这样的简单事情。我认为你不应该采用这种方法。

处理此问题的首选方法是 vertex-centric indices。如果您将任何数据反规范化到您的边缘,您应该考虑到这些索引(而不是将该数据编码到边缘标签中)。将朋友的一些唯一标识符放在 "friend" 边上并对其进行索引。

如果您的超级节点特别大(数百万+边),您还应该考虑 Titan 的 vertex partitioning 功能。