有没有办法为OR where子句优化此查询?

时间:2018-05-17 05:44:11

标签: neo4j cypher

以下查询需要347毫秒,这对我的应用程序来说太多了。有没有办法优化此查询?

profile
MATCH (s:product {id:'4554969'})-[r]->(o)
WHERE o:ExAttrs OR o:ProdAttrs
return s.item_sku_id, TYPE(r), o;

enter image description here

1 个答案:

答案 0 :(得分:0)

此时间不是查询时间,而是所有数据可用的时间(即,当驱动程序已收到所有数据时)。

您可以在标签中查看查询时间。

示例:

Started streaming 10 records after 1 ms and completed after 2 ms

您的查询未参数化,因此每次更改查询中的ID时,Neo4j都必须计算查询计划,因此您将丢失一些ms。

MATCH (s:product {id:$id})-[r]->(o)
WHERE o:ExAttrs OR o:ProdAttrs
return s.item_sku_id, TYPE(r), o

请参阅here如何将参数与您选择的驱动程序一起使用。

编辑:

public String query_partial_match(String skuid, String attrKey) {

        return "MATCH (s:product {id:'" + skuid + "'})-[r]->(o) " +
                "WHERE " +
                "(o:ExAttrs OR o:ProdAttrs) AND " +
                "any(key in keys(o) WHERE key =~'(?i).*(" + attrKey + ").*') " +
                "return s.item_sku_id, s.item_name, r, o";
    }

我有大约50个这样的Java函数来动态生成cypher查询字符串,然后将查询发送到驱动程序api的'execute'以获得结果。在上面的例子中,我已经使用'参数'方式生成正确的密码查询。但是,此参数化仅在我的查询生成代码中进行,但“执行”中没有参数化。我的同事将Neo4j本机驱动程序api包装成一个'Neo4jSearchAPI',它有一个'execute'方法,将一个cypher查询字符串作为参数在图上查询。我上面的代码就是生成这样的密码查询字符串。

因此,如果我想真正使用参数化,我们的包装Neo4jSearchAPI应该支持这一点。基本上,我的50个查询生成函数应该在Neo4jSearchAPI中编码,而不是我自己的代码,它只生成密码字符串。是对的吗?