Neo4J匹配查询-多种方法之间的差异
以下查询返回的结果有什么不同:Neo4J匹配查询-多种方法之间的差异,neo4j,Neo4j,以下查询返回的结果有什么不同: 1) MATCH (user)-[:hometown]->(city) MATCH (user)-[:speaks]->(language) RETURN user, city, language 2) MATCH (user)-[:hometown]->(city), (user)-[:speaks]->(language) RETURN user, city, language 3) MATCH (language)<-[:s
1) MATCH (user)-[:hometown]->(city) MATCH (user)-[:speaks]->(language) RETURN user, city, language
2) MATCH (user)-[:hometown]->(city), (user)-[:speaks]->(language) RETURN user, city, language
3) MATCH (language)<-[:speaks]-(user)-[:hometown]->(city) RETURN user, city, language
4) MATCH (user)-[:hometown]->(city) WITH user,city MATCH (user)-[:speaks]->(language) RETURN user, city, language
1)匹配(用户)->(家乡)->(城市)匹配(用户)->(语言)返回用户、城市、语言
2) 匹配(用户)-[:家乡]->(城市),(用户)-[:说]->(语言)返回用户,城市,语言
3) 匹配(语言)(城市)返回用户、城市、语言
4) 匹配(用户)-[:家乡]->(城市)与用户,城市匹配(用户)-[:讲]->(语言)返回用户,城市,语言
如果某些查询返回相同的结果,那么我想知道查询性能的差异。您可以使用关键字询问cypher它打算如何执行给定的查询。通过这种方式,您可以找出差异并得出结论,哪一个更快
我将通过两个问题向您说明我的意思:
neo4j-sh (?)$ profile MATCH (user)-[:hometown]->(city) MATCH (user)-[:speaks]->(language) RETURN user, city, language;
+------------------------+
| user | city | language |
+------------------------+
+------------------------+
0 row
ColumnFilter
|
+SimplePatternMatcher
|
+TraversalMatcher
+----------------------+------+--------+-----------------------------+-----------------------------------+
| Operator | Rows | DbHits | Identifiers | Other |
+----------------------+------+--------+-----------------------------+-----------------------------------+
| ColumnFilter | 0 | 0 | | keep columns user, city, language |
| SimplePatternMatcher | 0 | 0 | user, language, UNNAMED45 | |
| TraversalMatcher | 0 | 1 | | city, UNNAMED12, city |
+----------------------+------+--------+-----------------------------+-----------------------------------+
这是您的查询#4(稍作调整,因为您的查询#4没有按原样运行)
有很多方法来比较这些事情,但是从一般的角度考虑,DBhits(和其他类型的IO)是慢的,所以一个更小的查询计划就更好了。这些数字对我来说真的很小,因为我是在一个空数据库上做的,它们对你来说会不同
通常,您应该将查询中最有选择性的位推到开头。游戏的名字是考虑更少的数据,并最小化neo4j必须遍历的内容以找到答案 考虑这两个查询:它们是彼此的镜像,并返回相同的内容。但其中一个是非常有选择性的,另一个过于宽泛: 第1版:match (user {id: 1})
WITH user
MATCH (user)-[:has]->(item)
RETURN item;
第2版:
MATCH (item)
WITH item
MATCH (item)<-[:has]-(user)
WHERE user.id = 1
RETURN item;
匹配(项目)
带项目
MATCH(item)尝试使用标签来更好地优化数据库。但不能没有标签和索引来快速找到起始用户。
MATCH (item)
WITH item
MATCH (item)<-[:has]-(user)
WHERE user.id = 1
RETURN item;