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