首页 > 解决方案 > Gremlin:避免重复而不损失性能

问题描述

我正在尝试使用 gremlin python 在最短的时间内插入数百万个顶点和边。我有两件事要考虑:避免顶点和边的重复避免花费 10 个小时来插入所有数据

请求的主要时间是寻找现有顶点并创建关系。如果我在不检查顶点是否已经存在的情况下插入边,脚本会更快。

我也尝试过批处理交易,例如:

g.addV("person").property("name", "X").as_("p1")
 .addV("person").property("name", "Y").as_("p2")
 .addE("has_address").from("p1").to(g.V().has("address", "name", "street"))
 .addE("has_address").from("p2").to(g.V().has("address", "name", "street2")).iterate()

但我没有提高性能。

对于重复项,我会在查询中得到相同的结果吗?我认为以后重复查询会更贵吗?

谢谢。

标签: pythonperformanceduplicatesgremlin

解决方案


我对你最后一个问题的回答提供了一些关于如何“快速”加载数据的提示,现在我知道你的规模以百万计,我希望你会考虑这些策略。

如果您碰巧继续使用 Gremlin 和 Python 进行加载,请考虑以下几点:

  1. 我不确定你的重复来自哪里,但我会寻找机会来清理源数据并组织它和加载计划以避免首先加载它们,这将节省你以后的清理工作。我不能说重复是否会给您的查询留下相同的结果,因为我不知道您的数据也不知道您的查询。在某些图表和查询中,我知道重复是无关紧要和预期的,而在其他图表和查询中,这可能是一场灾难。
  2. 绝对尝试将您的负载组织到我在其他答案中建议的博客文章中的批处理模式中。这种方法比构建充满数百个addV()addE().
  3. 与第 1 项相关,您已经看到在插入之前查找图形元素的性能问题。考虑以避免重复顶点查找的方式对数据进行预排序。也许一种方法是首先加载所有顶点,以便您知道它们存在,然后对边缘负载进行分组/排序,以便您找到一次顶点并加载该顶点邻域中的所有边缘。
  4. 最后,如果你能弄清楚 1 和 3,那么也许你可以并行化负载。

同样,在此类论坛中无法真正提供具体细节,但也许这些想法会激发您的答案。


推荐阅读