我有以下密码查询,其中我必须UNWIND
大约100个数据。但我的问题是,要运行查询,需要花费很多时间来执行(大约3-4分钟)。
我的查询:
CREATE (pl:List {id: {id}, title: {title} })
WITH pl as pl
MATCH (b:Units {id: {bId} })
MERGE (b)-[rpl:UNITS_LIST]->(pl)
WITH pl as pl
UNWIND {Ids} as Id
MATCH (p:Infos {id: Id})
WITH p as cn, pl as pl
SET cn :Data
WITH pl as pl, cn as cn
MERGE (pl)-[cnpt:DATA_LIST { email: cn.email } ]->(cn)
RETURN pl
示例数据
List:
{
id: 'some-unique-id',
name: "some-name''
}
Ids ( Ids should be around 100 ):
[ 'some-info-id-01','some-info-id-03' ]
Infos (Neo4j DB):
[
{ id: 'some-info-id-01', others: 'some-others-data-01' },
{ id: 'some-info-id-02', others: 'some-others-data-02' },
{ id: 'some-info-id-03', others: 'some-others-data-03' }
]
任何改进此cypher查询的建议??
PS ,我在我的node.js应用中运行此CQL
。
答案 0 :(得分:1)
此查询看起来应该非常快如果您有适当的索引。
你应该有这些:
CREATE INDEX ON :Infos(id);
CREATE INDEX ON :Units(id);
CREATE INDEX ON :List(id);
使用这些索引时,查询应该很快,因为大多数情况下您需要通过这些ID查找节点,然后在此基础上执行非常小的操作。即使有100个ID,查询也不是那么难。
对应的是,如果你没有索引你的ID字段,neo4j必须查看其中的大部分/全部来确定要匹配的项目。您拥有的数据越多,此查询的速度就越慢。
如果您将这些内容编入索引并且您仍然看到效果非常慢,则需要EXPLAIN
查询并发布计划以获得进一步的反馈。