2014-11-14 48 views
2

一些背景信息:我有一个“问答”网站,有很多帖子和用户。数据存储在MSSQL数据库中。我很感兴趣的是图形数据库如何帮助用户产生有趣的结果,比如建议类似的用户或者建议相关的帖子。ArangoDB:GRAPH_NEIGHBORS产生错误“[1909]迭代太多”

我设法进口的所有帖子和用户(仅适用于它们的ID)和“后张贴”和“后向用户”关系,从一个测试数据库到ArangoDB数据库,并结束了4个集:

  1. 帖子:文档集,9833项
  2. 用户:文件集,1264项
  3. parentToChildPosts:边收集存储从父后关系到一个孩子后,4978项
  4. postToUsers:边收集从邮件存储关系给它的主人你ser,9833条目。

然后,我用2条边建立了一个图形“postGraph”,并创建了一个基于“用户帖子”和“帖子后”关系实现简单的“类似用户”算法的AQL查询。下面是该查询搜索前10名类似的用户来进行用户与_id“用户/ 1”:

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 

在视觉上,我开始从一个用户的用户/ 1的搜索,并找到路径给其他用户如下:

user => post => parent/child post => user。

所以遍历的深度为3。然后我排除用户本人(FILTER),组由用户密钥和计算结果的数量和抢前10

我测试查询和它的工作了大多数用户,但未能对一些活跃用户提供了错误:

[1909年]太多的迭代

查询运行(在一秒钟内)相当快,并给出了错误。其中一个失败的活跃用户有727个帖子(在我看来没有那么多)。

我也尝试过其他2种方式来实现该算法:

  1. 写3个GRAPH_NEIGHBORS查询模仿3个步骤之一穿越:慢得多。第一次运行需要大约3秒。
  2. 使用连接(不使用任何图功能):相当快。

从文档中,ArangoDB建议使用图形函数来处理这种情况。所以我不赞成使用Join(给我一种感觉,我也可以在SQL中做到这一点,所以为什么要使用图形数据库)。

任何建议如何使GRAPH_NEIGHBORS快速工作没有任何错误?或者其他任何建议如何建立图表,如图表可以增长多大?

回答

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遍历文档中的信息。 GRAPH_NEIGHBORS也提供一切可用GRAPH_NEIGHBORS https://docs.arangodb.com/Aql/GraphOperations.html

+0

嗨!非常感谢您的回复。我在GRAPH_NEIGHBORS下看不到“maxIterations”选项。我实际上搜索过它,只在“GRAPH_TRAVERSAL”选项下找到它。该文件不是最新的:)?我也只是尝试了你的建议,但它仍然产生了错误。我尝试了不同的maxIterations数字(甚至只是10),但它仍然产生相同的错误。 – ydou 2014-11-14 20:03:01

+0

好吧,我会检查是否有错误 – mchacki 2014-11-14 20:40:36

+0

maxIterations选项存在问题,它既没有记录也没有通过。我将在下一个版本中解决这个问题(2.3.1) – florian 2014-11-18 08:30:29