Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j-按发布日期的顺序获取发布节点列表_Neo4j_Cypher - Fatal编程技术网

Neo4j-按发布日期的顺序获取发布节点列表

Neo4j-按发布日期的顺序获取发布节点列表,neo4j,cypher,Neo4j,Cypher,我最近开始草拟一个涉及社交网络方面的个人项目。我对Neo4j有一些专业经验,虽然它感觉像是完美的搭配,但有一个问题与我有关 想象一个普通的社交网络:用户相互关注,用户发布帖子,用户可以看到他们关注的用户所写的帖子。这在Neo4j中通过:User和:Post标记的节点清晰地表达出来,通过:Post和:遵循关系进行连接 因此,我可以使用如下查询按我关注的用户获取帖子: MATCH (:User {user_id: 1})-[:follows]->(:User)-[:posted]->(p

我最近开始草拟一个涉及社交网络方面的个人项目。我对Neo4j有一些专业经验,虽然它感觉像是完美的搭配,但有一个问题与我有关

想象一个普通的社交网络:用户相互关注,用户发布帖子,用户可以看到他们关注的用户所写的帖子。这在Neo4j中通过
: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在这些场景中使用索引有点疯狂。再次感谢你为我指明了正确的方向。