Neo4j/Cypher 默认 rel-type 链排序问题

Neo4j/Cypher default rel-type chain ordering issue

这是关于大型子图的分页结果集的原始问题的跟进。

回顾一下 node-rel 结构:

(:User)-[:FOLLOWS {timestamp}]->(:User)

正如@michael-hanger 所建议的那样,order by 子句已被删除,因为 rel 类型链应该在时间戳之后按顺序返回,最近的关注者在最上面。

MATCH (u:User {Id:{id}})<-[f:FOLLOWS]-(follower)
WHERE f.timestamp <= {timestamp}
RETURN follower
LIMIT 100

问题是在一般情况下这是行不通的。

我发现如果 :User 节点有 50 个或更少的 :FOLLOWER 关系一切正常。追随者总是按时间戳排序返回,最近的在最前面。但是如果你有超过 50 :FOLLOWER 个关系,最后 50 个关注者总是返回倒置,最老的在上面。

即如果 :User 有 100 个关注者并且您按上述方式查询他们,您将获得列表,其中前 50 个从最新到最旧排序,最后 50 个从最旧到最新排序。通常,在任何关注者数量超过 50 的情况下,您都会有这样的排序。

谁能对这种行为提出建议。

默认情况下,任何超过 50 个关系的节点都被视为 "dense nodes"。普通节点在单个链中组织它们的关系,无论它们的类型和方向如何。

密集节点改为根据关系类型和方向管理单独的链。

您看到的是节点变成密集节点的效果,因此内部结构发生了重组。此阈值 - 默认为 50 - 可以使用 dense_node_treshold 配置选项进行配置。

根据您的数据模型,您可以考虑增加该值。

另一种不依赖于实现细节的方法:将 FOLLOWS 关系重构为节点。 :Follow 个节点与关注者有一种关系,一个与被关注者有关系,第三个节点根据给定人的所有 :Follow 个节点的时间戳形成一个链表。