2

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

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

例如,如果我已将电子邮件消息导入到集合中,而将人员导入到另一个集合中,我想在电子邮件和集合之间生成边缘。电子邮件的架构可能如下所示:

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

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

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

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

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

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

最终,我想基于定义边缘的文档之间的共享属性创建一个完整的 CRUD,包括一个“upsert”等价物——如果边缘已经存在则更新它,如果不存在则创建它。

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

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

4

1 回答 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

email顶点集合中的地址与顶点集合的电子邮件地址people相匹配。对于每场比赛,都会将一条新边插入边集合中,将人员和电子邮件记录联系起来。fromemailssent

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

于 2016-08-17T10:31:28.217 回答