一些背景信息:我有一个包含大量帖子和用户的“问答”网站。数据存储在MSSQL数据库中。我很感兴趣的是图形数据库如何帮助用户产生有趣的结果,比如建议类似的用户或建议相关的帖子。
我设法将所有帖子和用户(只有他们的ID)和“post to post”和“post to user”关系从测试数据库导入ArangoDB数据库,最终得到4个集合:
然后我用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个帖子(在我看来并不多)。
我还尝试了另外两种方法来实现算法:
从文档中,ArangoDB建议在这种情况下使用图形函数。所以我不赞成使用Join(给我一种感觉,我也可以在SQL中做到这一点,所以为什么要使用图形数据库)。
有任何建议如何让GRAPH_NEIGHBORS快速运行而不会出现任何错误?或者任何其他建议如何构建图表,比如图表可以增长多大?
答案 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
也可以使用其中的所有内容