我一直在研究这个问题。我有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子句的索引。有什么办法可以解决这个问题吗?以上查询是我的主要用例之一。
感谢。
答案 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将按照您选择的设计顺序返回,即电影观看时间戳的升序或降序。