没有START条款VS. n =节点(*)

时间:2013-10-21 20:12:12

标签: neo4j cypher

我在Neo4J 2.0文档中读到START子句是可选的

  

Cypher将尝试从您的查询中推断起点

我已经通过实验发现了

START user = node(*) 
MATCH (user:User)-[r:KNOWS]-(user2:User) 
RETURN user.username AS username, collect(user2.username) AS username2

给出与

相同的结果
MATCH (user:User)-[r:KNOWS]-(user2:User) 
RETURN user.username AS username, collect(user2.username) AS username2

用于小数据集。

我的问题是:它在语义上是一样的吗?他们总是会返回相同的结果集(我不是在谈论订单)吗?即使是大型数据集?跳过START是否保证遍历所有节点?如果它们在语义上相等,为什么会使用node(*)

1 个答案:

答案 0 :(得分:4)

您的查询在语义上不相同,但它们将始终返回相同的结果。他们将返回相同结果的原因是,在您的第一个查询中,已经声明了“通用节点模式”node(*),您立即在MATCH子句中使用其他模式限制它。在第二个查询中,您从一开始就说明了这个更窄的模式,但由于两个MATCH子句是等价的,并且在每个查询中声明了最窄的模式(并且因为RETURN子句是相同的)两个查询返回相同的结果。

START子句曾经是表示查询初始模式的方式,它与索引绑定在一起。很少推荐或使用node(*)relationship(*),但该子句用于索引检索,如START user=node:userIndex(name="Maciej Ziarko")中所述。引入了2.0标签和标签索引,现在这是在查询中绑定节点的首选方法。

跳过START并不能保证遍历所有节点(或者更准确地说:绑定所有节点),但是你也不需要START子句来执行此操作。使用MATCH user(不限制与user绑定的标签或关系)您仍然可以绑定数据库中的每个节点。它仍然很少被推荐或有用。