2

我在 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(*)

4

1 回答 1

4

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

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

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

于 2013-10-21T20:41:47.253 回答