如何使这个neo4j查询更快?
我有一个包含以下四个节点的数据库: 商店,吉他,吉他模型,配件 *吉他是指一个人可以拥有/弹奏的特定吉他如何使这个neo4j查询更快?,neo4j,graph-databases,Neo4j,Graph Databases,我有一个包含以下四个节点的数据库: 商店,吉他,吉他模型,配件 *吉他是指一个人可以拥有/弹奏的特定吉他 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
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)
我现在的问题是这个查询非常慢,大约需要120000毫秒才能执行
我有67000个节点和131000个关系
我是不是做错了什么,让事情变得这么慢
您对:storenumber有索引/约束吗?
为什么只使用可选的匹配项?您可以组合匹配和可选匹配
你为什么在WHERE子句中使用你的模式?你应该把它直接放在火柴上。
我认为您的查询在节点之间创建了笛卡尔积,这就是为什么它如此缓慢的原因
您可以尝试以下查询:
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]
当WHERE子句中有模式谓词时,它将在匹配后用作过滤器。因此,您将获得特定商店的所有:吉他的交叉产品、所有:吉他模型的交叉产品、所有:配件的交叉产品,然后过滤到与特定商店有关系的产品。正如logisima所说,在匹配中使用模式,这样它就可以直接从:Store遍历到关联的节点,并避免多个交叉产品。