如何优化 neo4j 查询.Neoj4 显示此警告:"此查询在断开连接的模式之间构建笛卡尔乘积"



我正在尝试运行此查询。

MATCH (p:Post), (me:User{username: 'someUsername'}) WHERE (
(
(me)-[:user_posted_post|user_share_post|post_in_gr|post_in_page]-(p) OR 
(
(me)-[{subscribe: '1'}]-()-[:post_in_gr]-(p)-[:user_posted_post|user_share_post]-({status:'active'}) OR
(me)-[{subscribe: '1'}]-()-[:post_in_page]-(p)-[:user_posted_post|user_share_post]-({status:'active'}) OR
(me)-[:user_author_page]-()-[:post_in_page]-(p)-[:user_posted_post|user_share_post]-({status:'active'}) OR
(me)-[{subscribe: '1'}]-({status:'active'})-[:user_posted_post|user_share_post]-(p:Post{system_type: 'page'}) OR
(me)-[{subscribe: '1'}]-({status:'active'})-[:user_posted_post|user_share_post]-(p) AND NOT (p)-[:post_in_gr]-() AND NOT (p)-[:post_in_page]-() OR
(me)-[:user_create_com]-()-[:com_in_post]-(p)
)
AND p.access IN ['everybody', 'friend'] OR 
(me)-[:user_can_see_post|user_posted_post]-(p) AND p.access = 'custom'
) 
) 
AND p.hidden_id IS NULL AND NOT (me)-[:user_hide_post]-(p) RETURN p ORDER BY p.updated_at DESC

Neo4j 说:"此查询在断开连接的模式之间构建笛卡尔乘积",并且运行查询非常慢,大约 8 秒。此警告是什么意思,我如何避免它并使其更快地工作?

由于这部分,您正在构建一个cartesian product(p:Post), (me:User{username: 'someUsername'})

在这里,你定义了一个不相交的模式:(p:Post)&(me:User{username: 'someUsername'})。因此,数据库必须在这两个不同的集合之间创建一个笛卡尔乘积。

但是我假设您对 :User(用户名(有一个独特的约束,所以笛卡尔实际上是 1xN,所以没关系(Neo4j 消息只是一个警告(。

由于您的子句复杂,您的查询速度很慢,有很多OR。与其在 where 子句中执行此操作,不如尝试将其直接放在MATCH部分或OPTIONAL MATCH中。

此外,我认为您的查询可以剪切为多个简单查询,您可以使用UNION连接它们。

干杯

最新更新