Optimization Neo4j:优化关系属性上的“WHERE”

Optimization Neo4j:优化关系属性上的“WHERE”,optimization,neo4j,cypher,query-optimization,Optimization,Neo4j,Cypher,Query Optimization,以下是我运行的查询: match (n:User), (n) -[r]-> (p:Platform {id:"apple"}), (n) -[l]-> (lang:Language {id: "en"}), (n) -[photos:REL]-> (:Event {type: "photo_upload"}) return * LIMIT 30 使用Scheme索引时,运行速度非常快(30-40ms)。但以下速度会减慢很多(>1000ms): 只有3000个节点与第一个查询

以下是我运行的查询:

match (n:User), 
(n) -[r]-> (p:Platform {id:"apple"}),
(n) -[l]-> (lang:Language {id: "en"}),
(n) -[photos:REL]-> (:Event {type: "photo_upload"})
return * LIMIT 30
使用Scheme索引时,运行速度非常快(30-40ms)。但以下速度会减慢很多(>1000ms):

只有3000个节点与第一个查询匹配,但添加
,其中
会将其速度降低到1秒。我知道我们没有关系属性索引,但即使这样,天真地循环3000个节点也不会花费1秒的时间,所以我猜我做错了什么,因为它似乎没有在匹配的节点上运行
WHERE
,而是在匹配之前运行。我如何优化它

第一次查询的配置文件计划:

第二个剖面图:

编辑:进一步调查:


当我把
跳过
时,速度会慢很多。因此,它似乎没有过滤每个路径上的匹配,而是单独匹配所有路径,然后合并,这会降低速度。是否有办法使其仅与结果匹配在您的评论中,您注意到首先在特定的
平台
语言
事件
节点上进行匹配加快了速度。这是因为这有助于将搜索集中在与这些特定节点相关的路径上。Cypher计划者并不总是老练到能够想出最有效的计划,所以有时候你必须帮助它

如果已在
:平台(id)
:语言(id)
、和
:事件(类型)
上创建索引(或唯一性约束),则以下查询应该是有效的


请注意,我必须给Cypher planner三个单独的提示来使用这三个索引(或唯一性约束),因为planner似乎更喜欢自己最多使用一个索引。如果使用所有3个索引快速获取3个节点以开始搜索,则应能获得最快的结果。

您是否尝试过使用配置文件执行查询?您是否可以将分析查询返回的查询计划添加到您的描述中(首先展开计划的所有元素)?@InverseFalcon Updated要清楚,执行这两个查询时数据库是否完全相同?是否确实需要:平台和:语言的关系和节点,或者你只是想让这些谓词来过滤:返回的用户?@InverseFalcon i-jusr希望它们被过滤。这种查询对于我来说是标准的,并且每个关系可能在其中有一个额外的过滤器
match (n:User), 
(n) -[r]-> (p:Platform {id:"apple"}),
(n) -[l]-> (lang:Language {id: "en"}),
(n) -[photos:REL]-> (:Event {type: "photo_upload"})
WHERE photos.count > 10
return * LIMIT 30
MATCH (p:Platform {id:"apple"}), (lang:Language {id: "en"}), (e:Event {type: "photo_upload"})
USING INDEX p:Platform(id)
USING INDEX lang:Language(id)
USING INDEX e:Event(type)
MATCH (n:User)-[r]->(p), (n)-[l]->(lang), (n)-[photos:REL]->(e)
WHERE photos.count > 10
RETURN *
LIMIT 30