在gremlin中,
s = graph.traversal()
g = graph.traversal(computer())
我知道第一个用于OLTP,第二个用于OLAP。我知道OLAP和OLTP在定义级别上的区别。我对此有以下疑问:
如何
提前致谢。
答案 0 :(得分:6)
从用户的角度来看,就结果而言,OLAP和OLTP之间没有真正的区别。 Gremlin语句与使用TraversalSource
和其他设置时显示的withComputer()
配置相同。
区别在于如何在幕后执行遍历。基于OLAP的遍历旨在处理整个图表" (即所有顶点/边缘,可能不止一次)。基于OLTP的遍历旨在处理较小的数据体,通常从一个或少量顶点开始并从那里遍历。当你考虑数十亿个边缘的图表时,很容易理解为什么需要像OLAP这样的有效机制来处理这些图形。
你真的不应该把OLTP和OLAP视为"更快" vs"慢"。根据{{3}}:
中的描述,可能更好地考虑它只要您的应用程序了解该遍历的要求,您就无法在应用程序中使用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()
但如果我想知道数据库中每个用户的平均年龄怎么办?在这种情况下,我没有任何索引可用于查找"一小组起始顶点" - 我必须在图表中处理所有数百万/十亿的顶点。这是OLAP的完美用例:
g.V().hasLabel('user').values('age').mean()
OLAP也非常适合了解图表的增长和维护图表。数十亿边缘和高数据摄取率,不知道你的图形不正确地增长是一个死刑判决。使用OLAP获取图表中所有数据的全局统计信息是很好的:
g.E().label().groupCount()
g.V().label().groupCount()
在上面的示例中,您将获得边/顶点标签分布。如果您对图表的增长方式有所了解,这可以很好地指示您的数据提取过程是否正常运行。在十亿边缘图上,尝试执行其中一个遍历将永远地"永远"如果它完全没有错误就完成了。