Я пытаюсь использовать ArangoDB, чтобы получить список друзей друзей. Не просто базовый список друзей друзей, я также хочу узнать, сколько друзей у пользователя и друга друг друга есть и сортировать результат. После нескольких попыток (повторного) написания наиболее эффективного AQL-запроса, это то, с чем я закончил:
LET friends = (
FOR f IN GRAPH_NEIGHBORS('graph', @user, {"direction": "any", "includeData": true, "edgeExamples": { name: "FRIENDS_WITH"}})
RETURN f._id
)
LET foafs = (FOR friend IN friends
FOR foaf in GRAPH_NEIGHBORS('graph', friend, {"direction": "any", "includeData": true, "edgeExamples": { name: "FRIENDS_WITH"}})
FILTER foaf._id != @user AND foaf._id NOT IN friends
COLLECT foaf_result = foaf WITH COUNT INTO common_friend_count
RETURN {
user: foaf_result,
common_friend_count: common_friend_count
}
)
FOR foaf IN foafs
SORT foaf.common_friend_count DESC
RETURN foaf
К сожалению, производительность не так хороша, как мне бы хотелось. По сравнению с версиями Neo4j одного и того же запроса (и данных), AQL кажется довольно медленным (5-10x).
То, что я хотел бы знать, - это... Как я могу улучшить наш запрос, чтобы он работал лучше?