更新:Wes在这里打了一个本垒打!谢谢..我已经添加了一个我正在使用neography Gem开发的Rails版本。完成相同的事情,但他的版本更快..请参阅下面的比较
我在Neo4j(1.9,REST,Cypher)中使用链接列表来帮助保持评论的正确顺序(是的,我知道我可以对时间进行排序等)。
(object node)---[:comment]--->(comment)--->(comment)--->(comment).... etc
目前我有900条评论,并且需要 7 秒才能完成整个列表 - 完全 不可接受..我和#39;我只是返回节点的ID(我知道,不要这样做,但不是他指向我的帖子)。
我想要做的就是找到评论的用户ID,这样我就可以返回一个计数...(比如" Joe和其他405人评论了你的帖子") ..现在,我甚至不计算此时的唯一节点 - 我只是为每条记录返回author_id ..(我后来担心计算 - 首先要注意基本的表现问题)。
start object=node(15837) match object-[:COMMENTS*]->comments return comments.author_id
7秒太长了......
我可以只使用一个对象并将所有注释直接链接到节点,而不是使用链接列表 - 但这可能会导致超级节点陷入困境,然后找到最新的注释,即使是跳过和限制,将是狗慢..
关系索引会有帮助吗?除了确保一个独特的关系,或者看看是否存在关系之外,我从未使用它们,但是我可以在密码查询中使用它们来帮助加快速度吗?
如果没有,我还能做些什么来减少返回ID的时间?
比较:这是使用"第二阶段"的Rails版本。 Neography gem的方法:
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毫秒中找到526个节点..
韦斯'解决方案需要5毫秒..: - )
答案 0 :(得分:2)
关系索引无济于事。我建议使用非托管扩展和遍历API - 对于长列表上的这个特定查询,它将比Cypher快很多。这个例子可以让你关闭:
https://github.com/wfreeman/linkedlistlength
我的基础是Mark Needham的例子: http://www.markhneedham.com/blog/2014/07/20/neo4j-2-1-2-finding-where-i-am-in-a-linked-list/
答案 1 :(得分:1)
如果您只是这样做以返回计数,那么这里最好的解决方案是不要在每个查询中找到它,因为它不经常改变。将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稍微关闭,不习惯&lt; 2.0语法。