gpt4 book ai didi

query-optimization - ArangoDB:通过示例作为查询函数插入

转载 作者:行者123 更新时间:2023-12-04 14:24:29 24 4
gpt4 key购买 nike

我的图的一部分是使用两个大集合之间的巨大连接构建的,每次我向任一集合添加文档时都会运行它。
该查询基于 older post .

FOR fromItem IN fromCollection
FOR toItem IN toCollection
FILTER fromItem.fromAttributeValue == toItem.toAttributeValue
INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection

对于我的数据集,这大约需要 55,000 秒才能完成。我绝对欢迎提出更快的建议。

但我有两个相关的问题:
  • 我需要一个更新。通常,upsert没问题,但在这种情况下,由于我无法预先知道 key ,因此对我没有帮助。为了预先获取 key ,我需要通过示例进行查询以找到其他相同的现有边的 key 。只要它不影响我的性能,这似乎是合理的,但我不知道如何在 AQL 中有条件地构造我的查询,以便在等效边尚不存在时插入边,但如果等效边不执行任何操作确实存在。我怎样才能做到这一点?
  • 每次将数据添加到任一集合时,我都需要运行它。我需要一种仅在最新数据上运行它的方法,这样它就不会尝试加入整个集合。如何编写允许我仅加入新插入记录的 AQL?它们是用 Arangoimp 添加的,我无法保证它们将按哪个顺序更新,因此我无法在创建节点的同时创建边。如何仅加入新数据?我不想在每次添加记录时花费 55k 秒。
  • 最佳答案

    如果您在没有任何索引的情况下运行您的查询,那么它将必须执行两次嵌套的完整集合扫描,这可以通过查看
    db._explain(<your query here>);
    它显示了类似的东西:

      1   SingletonNode                1   * ROOT
    2 EnumerateCollectionNode 3 - FOR fromItem IN fromCollection /* full collection scan */
    3 EnumerateCollectionNode 9 - FOR toItem IN toCollection /* full collection scan */
    4 CalculationNode 9 - LET #3 = (fromItem.`fromAttributeValue` == toItem.`toAttributeValue`) /* simple expression */ /* collections used: fromItem : fromCollection, toItem : toCollection */
    5 FilterNode 9 - FILTER #3
    ...

    如果你这样做
    db.toCollection.ensureIndex({"type":"hash", fields ["toAttributeValue"], unique:false})`

    然后将在 fromCollection 中进行一次全表集合扫描对于找到的每个项目,在 toCollection 中都有一个哈希查找。 ,这会快得多。一切都将分批发生,所以这应该已经改善了情况。 db._explain()将显示:
      1   SingletonNode                1   * ROOT
    2 EnumerateCollectionNode 3 - FOR fromItem IN fromCollection /* full collection scan */
    8 IndexNode 3 - FOR toItem IN toCollection /* hash index scan */

    仅处理 fromCollection 中最近插入的项目相对容易:只需将导入时间的时间戳添加到所有顶点,然后使用:
    FOR fromItem IN fromCollection
    FILTER fromItem.timeStamp > @lastRun
    FOR toItem IN toCollection
    FILTER fromItem.fromAttributeValue == toItem.toAttributeValue
    INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection

    当然,在 timeStamp 上放一个跳过列表索引 fromCollection 中的属性.

    这应该可以很好地发现 fromCollection 中的新顶点。 .它将“忽略” toCollection 中的新顶点链接到 fromCollection 中的旧顶点.

    您可以通过交换 fromCollection 的角色来发现这些。和 toCollection在您的查询中(不要忘记 fromAttributeValue 中的索引 fromCollection )并记住仅在起始顶点旧时才放入边,例如:
    FOR toItem IN toCollection
    FILTER toItem.timeStamp > @lastRun
    FOR fromItem IN fromCollection
    FILTER fromItem.fromAttributeValue == toItem.toAttributeValue
    FILTER fromItem.timeStamp <= @lastRun
    INSERT { _from: fromItem._id, _to: toItem._id, otherAttributes: {}} INTO edgeCollection

    这两个一起应该做你想做的。请找到完整的示例 here .

    关于query-optimization - ArangoDB:通过示例作为查询函数插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40119839/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com