如何使Neo4j查询更快?

时间:2019-06-20 14:28:32

标签: neo4j graph-databases

我有一个包含以下四个节点的数据库:

  

商店,吉他,GuitarModel,附件

*吉他指的是一个人可以拥有/弹奏的特定吉他

optional match (a:Store), (b:Guitar), (c:GuitarModel), (d:Accessory)
where a.StoreNumber ="1234" and (a)-[:ContainsGuitar]->(b) and
(b)-[:IS_OF_MODEL]->(c) and 
((d)-[:COMES_STANDARD]-(c) OR (d)-[:COMES_OPTIONAL]-(c) OR (d)-:COMES_OPTION_UPGRADE]-(c) OR (d)-[:COMES_UPGRADE]-(c))
return b.name, collect(d.name)

我现在的问题是此查询的运行速度很慢,大约需要120,000ms。

我有67,000个节点和131,000个关系。

所以我做错了什么使它变慢了吗?

1 个答案:

答案 0 :(得分:1)

  • 您在:Store(StoreNumber)上有索引/约束吗?
  • 为什么只使用可选匹配?您可以结合使用MATCHOPTIONAL MATCH
  • 您为什么要在WHERE子句中执行模式?您应该将其直接放在MATCH中。

我认为您的查询在节点之间创建了笛卡尔积,这就是为什么它这么慢的原因。

您可以尝试以下查询吗:

MATCH 
  (:Store { StoreNumber:"1234" })-[:ContainsGuitar]->(b)
RETURN 
  b.name, 
  [(b)-[:IS_OF_MODEL]->(:GuitarModel)-[:COMES_STANDARD|COMES_OPTIONAL|COMES_OPTION_UPGRADE|COMES_UPGRADE]-(d:Accessory) | d.name]