【发布时间】:2014-12-17 02:05:39
【问题描述】:
我有一个非常简单的结构:
U1-:VISITS->P1-:VISITS->P2-:VISITS->P3-VISITS->P4...
每个 VISITS 关系都有一个从 1 到 10 的评分。我对以 U1-:VISITS->P1-:VISITS->P2 开头的关系感兴趣,其中第一个评分
例如:
U1->P1->P2
U2->P1->P2
U3->P3->P4
应该有
P1,P2 2
P3,P4 1
我的解决方案
MATCH p=(a)-[r:VISITS]->(b:Page)-[t:VISITS]->(page:Page) WHERE r.rating<2 AND t.rating>5
WITH EXTRACT (n IN nodes(p)|n.page_id) AS my_pages,t AS rels RETURN DISTINCT(my_pages)
AS pages,count(DISTINCT rels) as count;
这非常慢(在 100 万个节点上需要 360733 毫秒(我分配了足够多的内存)。如果我再添加一个跃点
p=(a)-[r:VISITS]->(b:Page)-[t:VISITS]->(page:Page)-[s:VISITS]->(page:Page)
其中 s.rating>5,查询永远不会完成(或者完成时间太长)。有什么方法可以让查询更快吗?还是我做错了什么?
【问题讨论】:
-
这不是重复了几天前的问题吗?
-
我认出了问题中列出的第一个路径,它甚至不是完全定向的或在语法上是有效的。
-
是的,大部分是与stackoverflow.com/questions/27450470/…的副本(但略有不同)
-
那么...
a是用户吗?您是否有标签让它们将这些节点与Page节点区分开来?我会从那开始。您的Page节点可能比User节点多得多。User访问后续Pages(即在第一个之后)还是Pages访问Pages? -
我认为@DaveBennet 建议您在查询中包含
User标签。也就是说,(a:User)而不是(a)。这可能会加快您的查询速度,因为它会(大大?)减少与a匹配的节点数。