gremlin 中的 olap 和 oltp 查询
olap and oltp queries in gremlin
在 gremlin 中,
s = graph.traversal()
g = graph.traversal(计算机())
我知道第一个用于 OLTP,第二个用于 OLAP。我知道 OLAP 和 OLTP 在定义上的区别 level.I 对此有以下疑问:
如何
- 以上查询的工作方式不同?
- 我可以使用第二个吗,使用'g'
在我的应用程序查询中获取结果(我知道这个 'g' 一个
给出比第一个更快的结果)?
- OLAP 和 OLTP 之间的区别示例?
提前致谢。
从用户的角度来看,就结果而言,OLAP 和 OLTP 之间没有真正的区别。除了 TraversalSource
的配置外,Gremlin 语句与您在使用 withComputer()
和其他设置时所显示的相同。
更多的区别在于遍历是如何在幕后执行的。基于 OLAP 的遍历旨在处理 "entire graph"(即所有 vertices/edges 并且可能不止一次)。基于 OLTP 的遍历旨在处理较小的数据体,通常从一个或几个顶点开始并从那里遍历。当您考虑 "billions of edges" 规模的图形时,很容易理解为什么需要像 OLAP 这样的高效机制来处理此类图形。
您真的不应该将 OLTP 与 OLAP 视为 "faster" 与 "slower"。最好按照 documentation:
中的描述来考虑它
- OLTP:实时,有限数据访问,随机数据访问,
顺序处理,查询
- OLAP: long 运行ning, 整个数据集
访问,顺序数据访问,并行处理,批处理
处理
没有理由不能在您的应用程序中使用 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()
但是如果我想知道数据库中每个用户的平均年龄怎么办?在这种情况下,我没有任何可用于查找 "small set of starting vertices" 的索引 - 我必须处理图中所有许多 millions/billions 的顶点。这是 OLAP 的完美用例:
g.V().hasLabel('user').values('age').mean()
OLAP 也非常适合理解图形的增长和维护图形。拥有数十亿条边和高数据摄取率,不知道您的图表增长不当是死刑。最好使用 OLAP 获取图中所有数据的全局统计信息:
g.E().label().groupCount()
g.V().label().groupCount()
在上面的例子中,你得到一个 edge/vertex 标签分布。如果您知道图表的增长方式,这可以很好地指示您的数据摄取过程是否正常工作。在 10 亿条边图上,即使尝试执行一次遍历也需要 "forever",如果它完全没有错误地完成的话。
在 gremlin 中,
s = graph.traversal()
g = graph.traversal(计算机())
我知道第一个用于 OLTP,第二个用于 OLAP。我知道 OLAP 和 OLTP 在定义上的区别 level.I 对此有以下疑问:
如何
- 以上查询的工作方式不同?
- 我可以使用第二个吗,使用'g' 在我的应用程序查询中获取结果(我知道这个 'g' 一个 给出比第一个更快的结果)?
- OLAP 和 OLTP 之间的区别示例?
提前致谢。
从用户的角度来看,就结果而言,OLAP 和 OLTP 之间没有真正的区别。除了 TraversalSource
的配置外,Gremlin 语句与您在使用 withComputer()
和其他设置时所显示的相同。
更多的区别在于遍历是如何在幕后执行的。基于 OLAP 的遍历旨在处理 "entire graph"(即所有 vertices/edges 并且可能不止一次)。基于 OLTP 的遍历旨在处理较小的数据体,通常从一个或几个顶点开始并从那里遍历。当您考虑 "billions of edges" 规模的图形时,很容易理解为什么需要像 OLAP 这样的高效机制来处理此类图形。
您真的不应该将 OLTP 与 OLAP 视为 "faster" 与 "slower"。最好按照 documentation:
中的描述来考虑它- OLTP:实时,有限数据访问,随机数据访问, 顺序处理,查询
- OLAP: long 运行ning, 整个数据集 访问,顺序数据访问,并行处理,批处理 处理
没有理由不能在您的应用程序中使用 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()
但是如果我想知道数据库中每个用户的平均年龄怎么办?在这种情况下,我没有任何可用于查找 "small set of starting vertices" 的索引 - 我必须处理图中所有许多 millions/billions 的顶点。这是 OLAP 的完美用例:
g.V().hasLabel('user').values('age').mean()
OLAP 也非常适合理解图形的增长和维护图形。拥有数十亿条边和高数据摄取率,不知道您的图表增长不当是死刑。最好使用 OLAP 获取图中所有数据的全局统计信息:
g.E().label().groupCount()
g.V().label().groupCount()
在上面的例子中,你得到一个 edge/vertex 标签分布。如果您知道图表的增长方式,这可以很好地指示您的数据摄取过程是否正常工作。在 10 亿条边图上,即使尝试执行一次遍历也需要 "forever",如果它完全没有错误地完成的话。