Neo4j cypher vs match中where子句的效率

Neo4j cypher vs match中where子句的效率,neo4j,cypher,Neo4j,Cypher,我试图找到10篇用户“mike”使用cypher不喜欢的帖子。将where子句与NOT关系匹配是否比匹配可选关系更有效,然后在where子句中检查该关系是否为null?具体地说,我希望确保它不会执行与完整表扫描等效的操作,并确保这是一个可伸缩的查询 这是我用的 START user=node:node_auto_index(uname:"mike"), posts=node:node_auto_index("postId:*") WHERE not (user-[:LIKES]-&g

我试图找到10篇用户“mike”使用cypher不喜欢的帖子。将where子句与NOT关系匹配是否比匹配可选关系更有效,然后在where子句中检查该关系是否为null?具体地说,我希望确保它不会执行与完整表扫描等效的操作,并确保这是一个可伸缩的查询

这是我用的

START user=node:node_auto_index(uname:"mike"), 
  posts=node:node_auto_index("postId:*") 
  WHERE not (user-[:LIKES]->posts) 
  RETURN posts SKIP 20 LIMIT 10;
或者我可以在筛选匹配可选关系时做些什么

START user=node:node_auto_index(uname="mike"),
  posts=node:node_auto_index("postId:*")
  MATCH user-[r?:LIKES]->posts  
  WHERE r IS NULL
  RETURN posts SKIP 100 LIMIT 10;

控制台上的一些快速测试似乎显示第二种方法的性能更快。我假设第二个查询更快,对吗?如果是这样,原因是什么?

我认为在第一个查询中,引擎会运行所有
postID
节点,并手动检查每个post ID的
not(user-[:LIKES]->posts)
而在第二个示例中(假设您至少使用v1.9.02),引擎只拾取post节点,而这些节点实际上没有连接到用户。这只是优化,引擎不会通过所有postIDs节点


如果可能,请在查询中始终使用MATCH子句,而不是WHERE,并尝试在声明中省略asterix
START n=node:index('name:')

您的第二个查询与第一个查询相同,只是跳过了100个值。哪里不应该有匹配子句吗?是的,复制粘贴错误。问题现在更新为正确的第二个示例。如果我在start子句中省略了asterix,那么替代语法是什么?这是一个与图形设计相关的问题-如果您必须经常实时查询该查询,可能最好重新设计图形,直到您可以在没有asterix的情况下执行查询。然而,有时候这是做不到的。你能给我们提供你目前的数据库设计和目标吗?这是一个“用户”和“帖子”的图表。我使用“name”(针对用户)上的auto_索引和“postId”(针对帖子)上的auto_索引来区分节点类型。用户可以喜欢帖子。每天,我都想让用户随机浏览数百篇他们还不喜欢的帖子。为了举例说明,假设每天有数百万篇帖子被浏览,而“喜欢”的帖子有200000篇,创建的帖子有20000篇,用户注册有数千次。嗯,不知道在刚开始声明后过滤哪里会有帮助:
START user=node:node\u auto\u index(uname=“mike”)匹配用户-[r:LIKES]->以MAX(Id(posts))作为mx的帖子,用户START p=node:node_auto_index(“postd:”)匹配用户-[r?:LIKE]-p其中Id(p)>mx和Id(p)固定:
START user=node:node_auto_index(uname=“mike”)匹配用户-[r:LIKES]>以MAX(Id(posts))作为mx的帖子,用户START p=node:node_auto_index(“postd:”,其中Id(p)>mx和Id(p)