以下查询需要347毫秒,这对我的应用程序来说太多了。有没有办法优化此查询?
profile
MATCH (s:product {id:'4554969'})-[r]->(o)
WHERE o:ExAttrs OR o:ProdAttrs
return s.item_sku_id, TYPE(r), o;
答案 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中编码,而不是我自己的代码,它只生成密码字符串。是对的吗?