neo4j关于不看索引的关系

时间:2014-07-18 00:47:10

标签: 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 movie_rela.timeStamp desc 
   skip 0 
   limit 5;

它可以正常工作,但查询所花费的时间大约为10秒。如果我删除了movie_rela.timeStamp desc'的订单。它在大约2秒后回来。我已经在关系中索引了timestamp属性。然后我读到 Neo4J不遵守Order by子句的索引。有什么办法可以解决这个问题吗?以上查询是我的主要用例之一。

感谢。

1 个答案:

答案 0 :(得分:0)

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

(u:User)-[:FRIENDS]->(friend:User)-[r1:Like]->(m1:Movie)-[r2:Like]->(m2:Movie)-...

从User以最新到最旧的顺序创建关系Like的位置。并且r1,r2将包含时间戳和userid,以唯一地形成从特定用户到整个链中的电影的路径。直接连接到用户的电影是最新的,并且当用户节点和mOvie节点之间的距离(相似关系的数量)增加时,该特定电影被观看为最旧的。(您可以根据您的方便反转订单)

具有这种设计的好处是不需要基于时间戳排序。

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

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

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