我在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(*)
?
答案 0 :(得分:4)
您的查询在语义上不相同,但它们将始终返回相同的结果。他们将返回相同结果的原因是,在您的第一个查询中,已经声明了“通用节点模式”node(*)
,您立即在MATCH
子句中使用其他模式限制它。在第二个查询中,您从一开始就说明了这个更窄的模式,但由于两个MATCH
子句是等价的,并且在每个查询中声明了最窄的模式(并且因为RETURN
子句是相同的)两个查询返回相同的结果。
START
子句曾经是表示查询初始模式的方式,它与索引绑定在一起。很少推荐或使用node(*)
或relationship(*)
,但该子句用于索引检索,如START user=node:userIndex(name="Maciej Ziarko")
中所述。引入了2.0标签和标签索引,现在这是在查询中绑定节点的首选方法。
跳过START
并不能保证遍历所有节点(或者更准确地说:绑定所有节点),但是你也不需要START
子句来执行此操作。使用MATCH user
(不限制与user
绑定的标签或关系)您仍然可以绑定数据库中的每个节点。它仍然很少被推荐或有用。