Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4J匹配查询-多种方法之间的差异_Neo4j - Fatal编程技术网

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;