我正在尝试运行此查询。
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秒。这个警告意味着什么?如何避免它并使其更快地运行?
答案 0 :(得分:0)
由于此部分,您正在构建cartesian product
:(p:Post), (me:User{username: 'someUsername'})
在这里,您可以定义一个不相交的模式:(p:Post)
& (me:User{username: 'someUsername'})
。所以DB必须在这两个不同的集合之间创建一个cartesain产品。
但是我假设你有一个独特的约束:用户(用户名),所以笛卡尔实际上是1xN,所以它是#OK(Neo4j消息只是一个警告)。
你的查询很慢,因为你的复杂where子句,有很多OR
。您可以尝试将其直接放在MATCH
部分或OPTIONAL MATCH
中,而不是将其放入where子句中。
此外,我认为您的查询可以在多个简单查询中删除,您可以使用UNION
加入它们。
干杯