Neo4j 3.2密码低性能

Neo4j 3.2密码低性能,neo4j,cypher,Neo4j,Cypher,在不必要地过于具体的情况下,我在Neo4j 3.2中遇到了以下Cyper问题。假设我们有一个包含3个实体的数据库:User、Comment和Like 无论出于何种原因,我正在尝试运行以下查询: MATCH (n:USER) WHERE n.name = "name" WITH n MATCH (o:USER) WITH n, o, "2000" as number MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(l:LIKE)-[:CRE

在不必要地过于具体的情况下,我在Neo4j 3.2中遇到了以下Cyper问题。假设我们有一个包含3个实体的数据库:User、Comment和Like

无论出于何种原因,我正在尝试运行以下查询:

MATCH (n:USER) WHERE n.name = "name" 
WITH n 
MATCH (o:USER)
WITH n, o, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(l:LIKE)-[:CREATED_BY]->(o)
RETURN n, o, number, count(l)
查询需要几分钟才能完成。但是,如果我简单地删除2000作为数字部分,它将在几十毫秒内完成

有人能解释为什么吗

编辑: 顶部图像,2000为数字部分;底部,没有它


您必须清理查询,现在您没有使用索引,因此与特定名称的初始匹配很慢,然后对all:User节点执行笛卡尔乘积,然后为每一行创建字符串

因此,首先,在:USERname上创建一个索引,以便快速找到开始节点

那我们就得把剩下的比赛收拾干净

请尝试以下方法:

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)

假设您仍然需要该数字变量。

我的假设是您/cypher创建了32969个新字符串。您是否在JVM中遇到gc暂停?您在使用2000号码时是否也有同样的感受?谢谢您的回答。这确实澄清了一些事情。然而,这样写查询的原因是,第3行所做的不仅仅是匹配所有其他用户。在本例中,假设数据库中也有不喜欢的节点,尽管这是一个设计流程。查询应该计算n和每隔一个o之间不喜欢的节点数,然后也计算n和相同的每隔一个o之间所有喜欢的节点数。这仍然不是执行笛卡尔乘积的好理由,如果必须检查两种类型的节点,问题只会变得更糟。没有理由检查每个用户的模式。相反,只需检查模式本身找到了哪些用户。对于您不喜欢的用例,可能更容易不标记潜在的:LIKE或:unlike节点,然后使用用例获取每个节点的计数。
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