2016-08-12 58 views
1

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

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

例如,如果我已经导入电子邮件到一个集合,人们进入另外一个集合,我想生成电子邮件和集合之间的边缘。电子邮件的模式可能是这样的:

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

而一个人的模式可能是这样的:

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

比方说,在电子邮件的fromto字段中的值对应于电子邮件地址我们可以在人物收藏中找到。

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

到目前为止,我认为,福克斯可能是我们的最佳工具,但我有点被淹没的文档。

最后,我想创建一个基于文件定义的边缘,包括“UPSERT”等于以下,如果它已经存在更新的边缘,如果不创建它之间共享属性的完整的CRUD。

我知道,与标准的HTTP API单独的API调用这样做就太缓慢,因为我需要查询阿朗戈对每个文档的集合并返回非常大的数字结果。

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

回答

2

单一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个人和3000个电子邮件花了约2秒,在我的测试)。对于更大的数据集,一定要在peopleemail属性建立一个哈希索引,并在emailsfrom一个散列索引。在我的测试中,它将执行时间缩短到大约30ms。