gremlin中的olap和oltp查询

Ahi*_*Ahi 2 gremlin titan tinkerpop

在gremlin,

  1. s = graph.traversal()

  2. g = graph.traversal(computer())

我知道第一个用于OLTP,第二个用于OLAP.我知道OLAP和OLTP在定义级别上的区别.我对此有以下查询:

如何

  1. 上述查询有何不同?
  2. 我可以使用第二个,在我的应用程序的查询中使用'g'来获得结果(我知道'g'一个给出的结果比第一个更快)?
  3. OLAP和OLTP之间的区别是什么?

提前致谢.

ste*_*tte 7

从用户的角度来看,就结果而言,OLAP和OLTP之间没有真正的区别.Gremlin语句TraversalSource与您使用withComputer()和其他设置所显示的配置相同.

不同之处在于如何在幕后执行遍历.基于OLAP的遍历旨在处理"整个图形"(即所有顶点/边缘,可能不止一次).基于OLTP的遍历旨在处理较小的数据体,通常从一个或少量顶点开始并从那里遍历.当您考虑"数十亿边缘"的比例图时,很容易理解为什么需要像OLAP这样的有效机制来处理这些图.

你真的不应该把OLTP vs OLAP视为"更快"而不是"更慢".可能最好按照文档中的描述来考虑它:

  • OLTP:实时,有限数据访问,随机数据访问,顺序处理,查询
  • OLAP:长时间运行,访问整个数据集,顺序数据访问,并行处理,批处理

只要您的应用程序知道该遍历的要求,就没有理由不在应用程序中使用OLAP遍历.如果您有一些SLA表示REST请求必须在0.5秒内完成,并且您决定使用OLAP遍历来获得答案,那么您无疑会破坏您的SLA.假设您通过Spark执行OLAP遍历作业,它将使Spark需要10-15秒才能组织起来运行您的作业.

我不确定如何提供OLAP和OLTP的示例,除了稍微讨论用例之外,因此应该清楚何时使用一个而不是另一个.无论如何,让我们假设你有一个包含100亿边的图.您希望OLTP遍历始终以某种形式的索引查找开始 - 就像遍历显示用户"stephenm"的朋友的平均年龄:

g.V().has('username','stephenm').out('knows').values('age').mean()
Run Code Online (Sandbox Code Playgroud)

但是如果我想知道数据库中每个用户的平均年龄呢?在这种情况下,我没有任何索引可以用来查找"一小组起始顶点" - 我必须在我的图中处理所有数百万/十亿个顶点.这是OLAP的完美用例:

g.V().hasLabel('user').values('age').mean()
Run Code Online (Sandbox Code Playgroud)

OLAP也非常适合理解图表的增长和维护图表.数十亿边缘和高数据摄取率,不知道你的图形不正确地增长是一个死刑判决.使用OLAP获取图中所有数据的全局统计信息是很好的:

g.E().label().groupCount()
g.V().label().groupCount()
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您将获得边/顶点标签分布.如果您对图表的增长方式有所了解,这可以很好地指示您的数据提取过程是否正常运行.在十亿边缘图上,如果它完全没有错误地完成,那么试图执行甚至一个遍历将是"永远".