【问题标题】:Gremlin: Avoid duplicates without losing perfomanceGremlin:避免重复而不损失性能
【发布时间】:2021-03-12 08:41:05
【问题描述】:

我正在尝试使用 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()

但我并没有提高性能。

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

谢谢。

【问题讨论】:

    标签: python performance duplicates gremlin


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢斯蒂芬的回答。我有重复的问题,因为我不只导入一次数据,但我想每天都用新信息更新它;我添加到图中的新顶点或边可能已经存在。我阅读了您的博客文章,但我不明白该方法如何更快,我认为它与我在问题中编写的示例具有相同的执行时间。我认为问题在于找到已经存在的顶点或边,因为这种搜索会减慢数据的导入速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2014-07-21
    • 2022-01-04
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多