假设我有以FRIEND关系连接的节点。 我想每次查询其中的2个,所以我使用SKIP和LIMIT来维护它。
但是,如果有人在两次通话之间添加FRIEND,这会影响我的结果(因为突然“整个列表”被推向1个索引)。
例如,假设我有这个朋友列表(按某个参数排序):
A B C D
我第一次查询,所以我得到A B(跳过0且限制为2)。 然后有人添加一个名为E的朋友,列表现在是E A B C D. 现在第二个查询将返回B C(跳过2和限制2)。注意B返回两次,因为跳过方法不知道数据库的更改。
考虑到之前的查询,是否有办法每次返回2?例如,如果我知道B最后从查询返回,我可以将它提供给查询,它将查询2 NEXT,得到C D(这是正确的)而不是B C.
我尝试找到一个解决方案并阅读有关START和索引但我不知道该怎么做。
谢谢你的时间!
答案 0 :(得分:2)
您可以在创建FRIEND
关系时存储时间戳,并按该属性进行排序。
创建FRIEND
关系后,添加时间戳属性:
MATCH (a:Person {name: "Bob"}), (b:Person {name: "Mike"})
CREATE (a)-[r:FRIEND]->(b)
SET r.created = timestamp()
然后,当您通过朋友两个分页时,您可以通过created
属性进行排序:
MATCH (a:Person {name: "Bob"})-[r:FRIEND]->(friends)
RETURN friends SKIP {page_number_times_page_size} LIMIT {page_size}
ORDER BY r.created
您可以根据您想要的页面,使用页面大小(要返回的朋友数量)和要跳过的朋友数量来参数化此查询。
答案 1 :(得分:0)
很抱歉,如果你的问题没有得到答案。在我之前的项目中,我有修改大数据的经验。用一个查询修改所有内容是不可能的,所以我需要批量拆分它。首先,我开始使用跳过限制。但由于某些原因,它在某些情况下无法预测(未修改所有数据)。当我厌倦了找到改变方法的原因时。我用Java来查询数据库。所以我得到了我需要在第一次查询中修改的所有ID。在此之后,我运行存储的ID。