neo4j往返赛

neo4j往返赛,neo4j,cypher,Neo4j,Cypher,我有一个简单的查询,如下所示: MATCH (u1:User {id: 1})-[:WANTS]->(:Card)<-[:HAS]-(u2:User) WITH u1, u2 MATCH (u1)-[:HAS]->(:Card)<-[:WANTS]-(u2) RETURN COUNT(DISTINCT u2.id) 请注意,当我分别执行每个查询方向时,它们都很快: MATCH (u1:User {id: 1})-[:WANTS]->(:Card)<-[:HA

我有一个简单的查询,如下所示:

MATCH (u1:User {id: 1})-[:WANTS]->(:Card)<-[:HAS]-(u2:User)
WITH u1, u2
MATCH (u1)-[:HAS]->(:Card)<-[:WANTS]-(u2)
RETURN COUNT(DISTINCT u2.id)
请注意,当我分别执行每个查询方向时,它们都很快:

MATCH (u1:User {id: 1})-[:WANTS]->(:Card)<-[:HAS]-(u2:User)
RETURN COUNT(DISTINCT u2.id)
// COUNT(DISTINCT u2.id)
// 556
// Returned 1 row in 220 ms

MATCH (u1:User {id: 1})-[:HAS]->(:Card)<-[:WANTS]-(u2:User)
RETURN COUNT(DISTINCT u2.id)
// COUNT(DISTINCT u2.id)
// 14351
// Returned 1 row in 375 ms

MATCH(u1:User{id:1})-[:WANTS]->(:Card)(:Card)您应该指定节点标签以帮助限制要计算的节点。此查询是否提高了性能

MATCH (u1:User)-[:WANTS]->(:Card)<-[:HAS]-(u2:User)-[:WANTS]->(:Card)<-[:HAS]-u1
WHERE u1.id = 1 AND u1.id <> u2.id
RETURN COUNT(DISTINCT u2.id)

MATCH(u1:User)-[:WANTS]->(:Card)(:Card)我想我找到了。看看这是怎么做到的:

MATCH (u1:User {id : 1})-[:HAS]->(c1:Card)
WITH u1, c1
MATCH (c1)<-[:WANTS]-(u2:User)
WHERE u1 <> u2
WITH u1, u2, c1
MATCH (u1)-[:WANTS]->(c2:Card)
WITH u1, u2, c1, c2
MATCH (c2)<-[:HAS]-(u2)
RETURN count(DISTINCT u2.id)
匹配(u1:User{id:1})-[:HAS]->(c1:Card)
用u1,c1
匹配(c1)(c2:卡)
有u1,u2,c1,c2

嘿,吉姆,谢谢你的意见。整个查询需要17秒才能返回151个节点。我试着把这个问题分开,看看每场比赛需要多长时间。除了最后一个
匹配
之外的所有操作只需要300ms+。在最后一场比赛中,它上升到17秒。知道为什么吗?吉姆,我已经用更多的信息更新了这个问题。我为每个查询方向添加了结果,结果似乎很快。有一些可疑的事情正在发生,但我不能完全指出。是否有可能出现这样的情况(如cybersam在下面建议的那样),即用户1拥有用户1想要的卡,因此存在一个自引用循环?看看您的查询是如何构造的,第一个匹配返回556个不同的u2节点。除了优化,我认为(我不确定!)第二场比赛将进行556次,每次比赛有14351个独特的子结果,只有151个独特的成功。我敢打赌是第二部分杀了你。还有另一个想法。。。有多少张牌?我想知道通过卡节点“横向”攻击问题是否会更快?抱歉,此查询耗时82秒<代码>在82959毫秒内返回1行
MATCH (u1:User {id : 1})-[:HAS]->(c1:Card)
WITH u1, c1
MATCH (c1)<-[:WANTS]-(u2:User)
WHERE u1 <> u2
WITH u1, u2, c1
MATCH (u1)-[:WANTS]->(c2:Card)
WITH u1, u2, c1, c2
MATCH (c2)<-[:HAS]-(u2)
RETURN count(DISTINCT u2.id)