ArangoDB:GRAPH_NEIGHBORS产生错误" [1909]迭代太多"

时间:2014-11-14 18:59:26

标签: arangodb

一些背景信息:我有一个包含大量帖子和用户的“问答”网站。数据存储在MSSQL数据库中。我很感兴趣的是图形数据库如何帮助用户产生有趣的结果,比如建议类似的用户或建议相关的帖子。

我设法将所有帖子和用户(只有他们的ID)和“post to post”和“post to user”关系从测试数据库导入ArangoDB数据库,最终得到4个集合:

  1. 帖子:文件收集,9833条目
  2. 用户:文档集,1264个条目
  3. parentToChildPosts:存储从父帖子到子帖子的关系的边缘集合,4978条目
  4. postToUsers:边缘集合存储从帖子到其所有者用户的关系,9833个条目。
  5. 然后我用2条边构建了一个图形“postGraph”并创建了一个AQL查询,试图根据“用户帖子”和“帖子后”关系实现一个简单的“类似用户”算法。以下是使用_id“users / 1”搜索前10名类似用户的查询:

    FOR e in GRAPH_NEIGHBORS('postGraph', 'users/1', 
    { edgeCollectionRestriction: ['parentToChildPosts', 'postToUsers'], 
        vertexCollectionRestriction: 'users', 
        minDepth: 3, 
        maxDepth: 3 })
    FILTER e.vertex._key != '1'
    COLLECT userid = e.vertex._key INTO g
    SORT LENGTH(g) DESC
    LIMIT 10
    RETURN userid
    

    在视觉上,我从用户'users / 1'开始搜索,并找到以下其他用户的路径:

    user => post =>父母/子女帖子=>用户。

    因此,遍历的深度为3.然后我排除用户自己(FILTER),按用户键分组并计算结果数量并获得前10名。

    我测试了查询,它适用于大多数用户,但对于一些有错误的活跃用户来说失败了:

    [1909]迭代次数太多

    查询运行得非常快(在一秒钟内),并给出错误。其中一个失败的活跃用户有727个帖子(在我看来并不多)。

    我还尝试了另外两种方法来实现算法:

    1. 编写3个GRAPH_NEIGHBORS查询,模仿一次遍历的3个步骤:慢得多。第一次运行它需要大约3秒钟。
    2. 使用Join(不使用任何图形函数):非常快。
    3. 从文档中,ArangoDB建议在这种情况下使用图形函数。所以我不赞成使用Join(给我一种感觉,我也可以在SQL中做到这一点,所以为什么要使用图形数据库)。

      有任何建议如何让GRAPH_NEIGHBORS快速运行而不会出现任何错误?或者任何其他建议如何构建图表,比如图表可以增长多大?

1 个答案:

答案 0 :(得分:5)

嗨,你完全正确,GRAPH_NEIGHBORS功能就是为此而构建的。 有一个参数maxIterations限制一个遍历(GRAPH_NEIGHBORS映射到其上)将触及的顶点数量,并且您的图形结构可能会在那里达到默认值(10000)。我们实现了这个值以防止无限循环。 因此,要解决此问题,您只需增加此值即可。 我还有另一个表现提示: *如果您的图表仅包含两个edgeCollections,则不必为限制设置它们。所以我们可以在那里保存支票。 (不会很重要)

这是一个更新的查询:

FOR e in GRAPH_NEIGHBORS('postGraph', 'users/1', 
  { maxIterations: 1000000, 
    vertexCollectionRestriction: 'users', 
    minDepth: 3, 
    maxDepth: 3 })
FILTER e.vertex._key != '1'
COLLECT userid = e.vertex._key INTO g
SORT LENGTH(g) DESC
LIMIT 10
RETURN userid

有关详细信息,请坚持使用AQL Traversal文档中的信息。 GRAPH_NEIGHBORS https://docs.arangodb.com/Aql/GraphOperations.html

也可以使用其中的所有内容