我怎样才能优化neo4j查询。 Neoj4显示此警告:“此查询在断开连接的模式之间构建笛卡尔积”

时间:2017-07-26 05:52:17

标签: neo4j

我正在尝试运行此查询。

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秒。这个警告意味着什么?如何避免它并使其更快地运行?

1 个答案:

答案 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加入它们。

干杯