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
个节点的时间戳形成一个链表。
这是关于大型子图的分页结果集的原始问题的跟进。
回顾一下 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
个节点的时间戳形成一个链表。