2013-10-21 113 views
2

我读的Neo4j 2.0文档即START子句是可选的,无START条款与VS. N =

的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(*)

回答

4

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

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

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