neo4j往返比赛

时间:2014-09-09 18:22:18

标签: 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)

现在用户1有500个他感兴趣的用户,其中有500个人对他感兴趣。这有点奇怪,因为查询看起来很简单,但执行它需要22秒,所有需要索引的字段都被编入索引。

这是我的输出:

COUNT(DISTINCT u2.id)
151
Returned 1 row in 22270 ms

请注意,当我单独执行每个查询指示时,它们会变得很快:

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

我只是想知道查询是否可以优化,因为我很可能neo4j可以用一只手绑在背后。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您应指定节点标签以帮助限制评估的节点。此查询是否会提高性能?

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)

答案 1 :(得分:0)

我想我明白了。看看这是怎么回事:

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)

此测试在我的测试中运行得更快。