首页 文章

以编程方式在ArangoDB中创建边

提问于
浏览
2

以编程方式快速创建ArangoDB边缘的最简单方法是什么?

我想基于公共属性在文档之间创建关系 . 我希望能够选择一个属性,并且对于集合A中的每个文档,为集合B中的每个文档创建一个边,该文档在等效属性中具有相同的值 .

例如,如果我将电子邮件导入集合,将人员导入另一个集合,我希望在电子邮件和集合之间生成边缘 . 电子邮件的架构可能如下所示:

{
  "_key":
  "subject":
  "body":
  "from":
  "to":
}

一个人的架构可能如下所示:

{
  "_key":
  "name":
  "email":
}

假设电子邮件中的 fromto 字段中的值对应于我们可能在人员集合中找到的电子邮件地址 .

我希望能够将集合,属性和边缘参数作为输入,然后,对于人员集合中的每个文档,为 from 属性中具有相同电子邮件地址的电子邮件集合中的每个文档创建边缘作为当前文档的 email 属性 .

到目前为止,我认为Foxx可能是最好的工具,但我对文档有点不知所措 .

最后,我想基于定义边缘的文档之间的共享属性创建完整的CRUD,包括“upsert”等效 - 如果已存在则更新边缘,如果不存在则创建边缘 .

我知道使用标准HTTP API对单独的API调用执行此操作会非常慢,因为我需要为集合中的每个文档查询Arango并返回大量结果 .

是否已经有Foxx服务这样做?如果没有,我应该从哪里开始创建一个?

1 回答

  • 3

    单个AQL查询就足够了:

    FOR p IN people
        FOR e IN emails
            FILTER p.email == e.from
            INSERT {_from: p._id, _to: e._id} INTO sent
    

    顶点集合 people 中的 email 地址与 emails 顶点集合的 from 电子邮件地址匹配 . 对于每个匹配,新边将插入边集合 sent ,链接人和电子邮件记录 .

    如果两个顶点集合都包含少量文档,则可以在没有索引的情况下执行此查询(例如,1000个人和3,000封电子邮件在我的测试中花了大约2秒钟) . 对于较大的数据集,请确保在 email 属性的 people 中创建哈希索引,并在 emails 中在 from 上创建哈希索引 . 它在我的测试中将执行时间减少到大约30ms .

相关问题