你将不得不清理你的查询,现在你不使用索引(所以用特定名称初始匹配是慢),然后执行笛卡尔针对所有产品:用户节点,然后为每一行创建字符串。因此,首先在USER(name)上创建一个索引,以便快速找到您的开始节点。我们将不得不清理比赛的其余部分。
尝试这样代替:
MATCH (n:USER) WHERE n.name = "name"
WITH n, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(l:LIKE)-[:CREATED_BY]->(o:User)
RETURN n, o, number, count(l)
你应该在查询看到一个类似的计划与此查询为没有“2000”。
这样做的原因是,虽然你的计划与您匹配o
笛卡尔积,规划是足够的智能,实现有一个附加的限制为o
,它曾在图案出现在你的最后一场比赛,并且针对这种情况进行优化可以避免执行笛卡尔产品。
然而,一个新变量number
的介绍阻止了规划人员认识到这基本上是相同的情况,因此规划人员没有优化笛卡尔产品。
现在,尝试明确您希望执行查询的方式,并尽量避免在查询中使用笛卡尔积。
在这种特殊情况下,意识到当你在第三行有MATCH (o:User)
时,这并不是说o
的类型是a:用户在后面的匹配中,而是说你的结果中的每一行到目前为止,针对所有用户节点执行笛卡尔乘积,然后针对每个用户节点,查看提供的模式中存在哪些节点。与简单地扩展提供的模式并获取任何内容相比,这是很多不必要的工作:您在模式的另一端找到的用户节点。
编辑
至于获得两项:LIKE和:厌恶节点数,也许尝试这样的事:
MATCH (n:USER) WHERE n.name = "name"
WITH n, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(likeDislike)-[:CREATED_BY]->(o:User)
WITH n, o, number, head(labels(likeDislike)) as type, count(likeDislike) as cnt
WITH n, o, number, CASE WHEN type = "LIKE" THEN cnt END as likeCount, CASE WHEN type = "DISLIKE" THEN cnt END as dislikeCount
RETURN n, o, number, sum(likeCount) as likeCount, sum(dislikeCount) as dislikeCount
假设你仍然需要number
变量在那里。
我的假设是你/ cypher创建32969个新的字符串。你是否在JVM中执行gc暂停?使用数字2000时您是否遇到同样的情况? – manonthemat