更新:韦斯在这里打了一个全垒打!谢谢..我添加了一个使用neography Gem开发的Rails版本。做同样的事,但他的版本更快。参见下面的比较
我正在使用Neo4j中的链接列表(1.9、REST、Cypher)来帮助保持注释的正确顺序(是的,我知道我可以按时间等进行排序)。
(object node)---[:comment]--->(comment)--->(comment)--->(comment).... etc 目前,我有900个评论,需要7秒才能完成整个列表--完全不能接受..我只是返回节点的ID (我知道,不要这样做,但这不是我的帖子的他点)。
我想要做的是找到评论用户的ID,这样我就可以返回一个计数。(比如“乔和405人在你的帖子上发表评论”)。现在,我甚至不计算唯一的节点--我只是返回每个记录的author_id ..(我会担心稍后计数--首先要处理基本的性能问题)。
start object=node(15837) match object-[:COMMENTS*]->comments return comments.author_id7秒太长了。
与其使用链接列表,我只需拥有一个对象并将所有注释直接链接到节点--但这可能会导致一个超级节点陷入困境,然后找到最新的评论,即使有跳过和限制,也会很慢。
关系索引在这里有帮助吗?除了确保一种独特的关系,或者查看关系是否存在之外,我从来没有使用过它们,但是我可以在密码查询中使用它们来帮助加快速度吗?
如果没有,我还能做些什么来减少返回it所需的时间?
比较:这里是Rails版本,使用了Neography的“第二阶段”方法:
next_node_id=18233
@neo=Neography::Rest.new
start_node = Neography::Node.load(next_node_id, @neo)
all_nodes=start_node.outgoing(:COMMENTS).depth(10000)
raise all_nodes.size.to_i结果:在290 in中发现526个节点。
韦斯的解决方案花了5毫秒。:-)
发布于 2014-09-23 06:30:55
关系索引不会有帮助。我建议使用非托管扩展和遍历API--对于长列表上的这个特定查询,它将比Cypher快得多。这个例子应该能让你更接近:
https://github.com/wfreeman/linkedlistlength
我是以Mark的例子为基础的:http://www.markhneedham.com/blog/2014/07/20/neo4j-2-1-2-finding-where-i-am-in-a-linked-list/
发布于 2014-09-23 17:07:03
如果您这样做只是为了返回一个计数,那么这里最好的解决方案就是不要在每个查询上找出它,因为它不会经常更改它。将total_comments属性中节点上的结果缓存到节点。每次添加或删除关系时,都要更新此计数。如果您想知道当前用户的任何朋友是否对其进行了评论,以便您可以说,"Joe和其他700人对此发表了评论“,那么您可以执行第二个查询:
start joe=node(15830) object=node(15838) match joe-[:FRIENDS]->friend-[:POSTED_COMMENT]->comment<-[:COMMENTS]-object RETURN friend LIMIT 1
你限制在1,因为你只需要一个朋友的名字谁评论。如果它返回某人,调整由1显示的注释数量,包括用户名。您可以使用JS这样做,这样它就不会延迟您的页面加载。对不起,如果我的Cypher有点错误,不习惯于<2.0语法。
https://stackoverflow.com/questions/25985130
复制相似问题