Neo4j-按发布日期的顺序获取发布节点列表
我最近开始草拟一个涉及社交网络方面的个人项目。我对Neo4j有一些专业经验,虽然它感觉像是完美的搭配,但有一个问题与我有关 想象一个普通的社交网络:用户相互关注,用户发布帖子,用户可以看到他们关注的用户所写的帖子。这在Neo4j中通过Neo4j-按发布日期的顺序获取发布节点列表,neo4j,cypher,Neo4j,Cypher,我最近开始草拟一个涉及社交网络方面的个人项目。我对Neo4j有一些专业经验,虽然它感觉像是完美的搭配,但有一个问题与我有关 想象一个普通的社交网络:用户相互关注,用户发布帖子,用户可以看到他们关注的用户所写的帖子。这在Neo4j中通过:User和:Post标记的节点清晰地表达出来,通过:Post和:遵循关系进行连接 因此,我可以使用如下查询按我关注的用户获取帖子: MATCH (:User {user_id: 1})-[:follows]->(:User)-[:posted]->(p
:User
和:Post
标记的节点清晰地表达出来,通过:Post
和:遵循关系进行连接
因此,我可以使用如下查询按我关注的用户获取帖子:
MATCH (:User {user_id: 1})-[:follows]->(:User)-[:posted]->(p:Post)
RETURN p
这是相当干净和简单的。我担心的是,实际上我会想得到最近的10个帖子,然后是之后的10个帖子,依此类推
因此,我在:Post
节点中的created_at
字段上创建了一个索引,并在查询中添加了一个ORDER BY p.created_at DESC
子句。我认为这将使我能够有效地对它们进行排序,但是在这个查询上运行EXPLAIN
表明orderby
子句在很大程度上不会使用索引来加速这个过程。因此,当结果集变得非常大时,我不确定是否有办法有效地获得这些结果
这可能是由于缺乏经验或只是错误地处理此数据模型。我能得到一些关于这类问题的信息吗?我应该以不同的方式对数据建模吗?我的查询/索引错误吗?有什么我遗漏的吗?你会怎么做
编辑1:类似我的意思的示例查询:
MATCH (:User {user_id: 1})-[:follows]->(:User)-[:posted]->(p:Post)
RETURN p
ORDER BY p.created_at DESC
LIMIT 10
另外,我一直在想,使用范围(在WHERE
子句中)可以限制结果集的大小,但仍然不确定是否有更好的方法
编辑2(解决方案):这是使Cypher planner使用索引解决此问题的最终查询:
MATCH (:User {user_id: 1})-[:follows]->(:User)-[:posted]->(p:Post)
USING INDEX p:Post(created_at)
WHERE p.created_at < datetime()
RETURN p
ORDER BY p.created_at DESC
LIMIT 10
MATCH(:User{User\u id:1})-[:follows]->(:User)-[:posted]->(p:Post)
使用索引p:Post(在创建时创建)
其中p.created_在
Neo4j 3.5引入了一些限制
但是,目前(在neo4j 3.5.3中),即使在ORDER BY
支持使用索引时,Cypher planner似乎也不会自动将其用于该目的。在我对3.5.3版的实验中,我发现如果在WHERE
子句中不使用索引,那么计划员将根本不使用索引
因此,作为一个简单的解决方法,您可以使用索引添加一个简单的WHERE
子句。例如,下面是一个修改后的查询版本,它将“欺骗”计划者使用ORDER BY
的索引:
MATCH (:User {user_id: 1})-[:follows]->(:User)-[:posted]->(p:Post)
WHERE p.created_at > 0
RETURN p
ORDER BY p.created_at DESC
LIMIT 10
你能在你的问题中显示对帖子进行排序的查询吗?另外,您是否正在使用neo4j 3.5+?@cybersam我添加了一个示例查询。这仍然是非常假设的,我只使用了一个示例数据模型。我知道在3.5中,索引的使用按顺序进行了改进,但是它相当有限,并且只适用于升序(与我需要的相反)。如果我错过了什么,请告诉我!它还支持降序排序。请参阅我的答案以了解解决方法。谢谢您的帮助!在我生成的一个小数据集上分析该查询仍然不使用索引(100个用户,每个用户有100篇文章,在一个跟踪所有其他99个用户的用户上进行测试,在68毫秒内生成48291个数据库点击)。但我发现添加一个使用索引p:Post(created_at)
子句确实会使用索引,在3毫秒内只生成227个数据库点击。让Neo4j在这些场景中使用索引有点疯狂。再次感谢你为我指明了正确的方向。