neo4j按关系排序,不查看索引

neo4j按关系排序,不查看索引,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,我研究这个问题已经有一段时间了。我有以下模式的neo4j设置: 用户有朋友,用户喜欢电影。我的一个主要用途是让我所有的朋友都喜欢所有的电影。我就是这样做的: start user=node:userIndex(uid="1234") match user-[friend_rela:FRIENDS]-(friend)-[movie_rela:LIKE]->movie return distinct movie,movie_rela,friend order by mo

我研究这个问题已经有一段时间了。我有以下模式的neo4j设置:

用户有朋友,用户喜欢电影。我的一个主要用途是让我所有的朋友都喜欢所有的电影。我就是这样做的:

start user=node:userIndex(uid="1234") 
   match user-[friend_rela:FRIENDS]-(friend)-[movie_rela:LIKE]->movie 
   return distinct movie,movie_rela,friend 
   order by movie_rela.timeStamp desc 
   skip 0 
   limit 5;
它工作正常,但查询所花费的时间大约为10秒。如果我删除“order by movie_rela.timeStamp desc”,它将在大约2秒钟后返回。我已经为关系中的timestamp属性编制了索引。然后我读到Neo4J不支持ORDERBY子句上的索引。有什么办法可以解决这个问题吗?上面的查询是我的主要用例之一


谢谢

您可以重新设计图形。假设一个朋友可以喜欢多部电影和不同的时间戳。所以你的图表可以是

(u:User)-[:FRIENDS]->(friend:User)-[r1:Like]->(m1:Movie)-[r2:Like]->(m2:Movie)-...
其中,像这样的关系是按照从最新到最旧的顺序从用户创建的。r1、r2将包含时间戳和userid,以便在整个链中唯一地形成从特定用户到电影的路径。直接连接到用户的电影是最新的,并且随着用户节点和电影节点之间的距离(相似关系的数量)的增加,该特定电影的观看时间最长。(您可以根据自己的方便颠倒顺序)

采用这种设计的好处是,不需要基于时间戳进行订购

对于任何用户,如果您希望获得他喜欢的所有电影,请运行

Match (u:User)-[:Like*1..]->(m:Movie) return m

在这里,m将按照您选择的设计类型返回,即电影观看时间戳的升序或降序。

我正在使用SDN进行neo4j项目。relationship属性明确定义了开始节点类型和结束节点类型。从上面的示例中,同一关系的开始节点为“User”或“Movie”。我喜欢这个主意,但正在考虑如何做到。我还使用了Neo4j 1.9.5。Neo4j 2.0中的[Like*1..]不是吗?不是。。你可以在neo4j 1.9ok中进行这种匹配。。使用SDN和不同类型的起始节点创建关系怎么样?因为在这种情况下,LIKE关系将用户和电影作为开始节点。此外,用户可以有许多朋友,每个朋友都可以有自己的电影集。基于上述方法,我如何按时间戳排序,汇总他朋友喜欢的所有电影?我仍然可以得到他所有朋友喜欢的所有电影的列表,但是接下来是排序,这是否仍然是一个问题?您可以在关系中使用userid属性,如与timestamp。。因此,对于一个特定的用户和他喜欢的所有电影,都会有这些用户ID来识别他独特的喜好。返回的电影节点列表将按顺序排列,因为节点以linkedlist的形式存储在底层结构中。嘿,你尝试了什么吗?我暂时保留了Sumeet模式。当我直接查询数据库时,事情似乎非常快。但是,当我使用SDN来做这项工作时,出现了一些问题。还在调查原因。谢谢你做的一切,苏米特。谢谢。