我在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(*)
?
发布于 2013-10-21 12:41:47
您的查询在语义上并不相同,但它们总是返回相同的结果。他们将返回相同结果的原因是,在您的第一个查询中,在声明了“通用节点模式”node(*)
之后,您将立即在MATCH
子句中使用进一步的模式来限制它。在第二个查询中,您从一开始就说明了这个更窄的模式,但是由于两个MATCH
子句是等价的,而且每个查询中声明的最窄的模式是相同的(而且RETURN
子句是相同的),所以两个查询返回相同的结果。
START
子句过去用于声明查询的初始模式,它与索引绑定在一起。很少建议或使用node(*)
或relationship(*)
,但子句用于索引检索,如START user=node:userIndex(name="Maciej Ziarko")
中的那样。在2.0版本中,引入了标签和标签索引,这现在是绑定查询中节点的首选方法。
跳过START
并不能保证遍历所有节点(或者更准确地说:绑定所有节点),但是您也不需要一个START
子句。使用MATCH user
(不限制使用标签或关系绑定到user
的内容)仍然可以绑定数据库中的每个节点。它仍然很少被推荐或有用。
https://stackoverflow.com/questions/19503801
复制相似问题