我有一个包含以下四个节点的数据库:
商店,吉他,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个关系。
所以我做错了什么使它变慢了吗?
答案 0 :(得分:1)
:Store(StoreNumber)
上有索引/约束吗?MATCH
和OPTIONAL 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]