2016-08-12 31 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。