我正在尝试运行此查询。
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
连接它们。
干杯