为什么这个 Cypher 查询更快?
Why is this Cypher query faster?
我刚刚阅读了 this page Neo4j 的官方文档。
它显示了一种 Cypher 方法来专门检索朋友的朋友:
MATCH (joe { name: 'Joe' })-[:knows*2..2]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)
RETURN friend_of_friend.name, COUNT(*)
ORDER BY COUNT(*) DESC , friend_of_friend.name
为什么下面的方式更快? :
MATCH path = shortestPath((joe { name: 'Joe' })-[:KNOWS*..2]-(friend_of_friend))
WHERE length(path) = 2
WITH nodes(path)[-1] AS secondDegreeFriends //retrieving the friend_of_friend nodes
RETURN secondDegreeFriends._name, COUNT(*)
ORDER BY COUNT(*) DESC , secondDegreeFriends.name
(第二个查询分别为 33 毫秒和 22 毫秒,均在图中 182 个成员的上下文中)
首先,没有一些测试数据,很难证明你查询的某些方面的差异。
我在这里看到了一些要点:
在第一个查询中,您没有使用标签和索引 属性 因此整个模式匹配将产生一个遍历匹配器,这是一个全局图查找。
否定总是代价高昂的,而 WHERE 子句中模式的否定代价高昂。
我建议您使用 PROFILE 运行 shell 中的查询并检查执行计划结果。
- 未指定关系方向的模式上的最短路径具有更好的路径匹配算法。
我刚刚阅读了 this page Neo4j 的官方文档。
它显示了一种 Cypher 方法来专门检索朋友的朋友:
MATCH (joe { name: 'Joe' })-[:knows*2..2]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)
RETURN friend_of_friend.name, COUNT(*)
ORDER BY COUNT(*) DESC , friend_of_friend.name
为什么下面的方式更快? :
MATCH path = shortestPath((joe { name: 'Joe' })-[:KNOWS*..2]-(friend_of_friend))
WHERE length(path) = 2
WITH nodes(path)[-1] AS secondDegreeFriends //retrieving the friend_of_friend nodes
RETURN secondDegreeFriends._name, COUNT(*)
ORDER BY COUNT(*) DESC , secondDegreeFriends.name
(第二个查询分别为 33 毫秒和 22 毫秒,均在图中 182 个成员的上下文中)
首先,没有一些测试数据,很难证明你查询的某些方面的差异。
我在这里看到了一些要点:
在第一个查询中,您没有使用标签和索引 属性 因此整个模式匹配将产生一个遍历匹配器,这是一个全局图查找。
否定总是代价高昂的,而 WHERE 子句中模式的否定代价高昂。
我建议您使用 PROFILE 运行 shell 中的查询并检查执行计划结果。
- 未指定关系方向的模式上的最短路径具有更好的路径匹配算法。