【问题标题】:neo4j slow in returning pathsneo4j 返回路径缓慢
【发布时间】: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 匹配的节点数。

标签: neo4j cypher


【解决方案1】:

正如@cybersam 和@DaveBenett 建议的那样,您应该为您的用户分配一个标签。此外,通过引入 WITH 语句来帮助 Cypher 提前终止分支可能是有意义的:

MATCH (u:User)-[r:VISITS]->(b:Page)
WHERE r.rating < 2
WITH u, b
MATCH (b)-[t:VISITS]->(page:Page)
WHERE t.rating > 5
RETURN ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多