Neo4j:提高密码性能

时间:2018-03-07 11:43:20

标签: neo4j cypher

我有以下密码查询,其中我必须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

1 个答案:

答案 0 :(得分:1)

此查询看起来应该非常快如果您有适当的索引。

你应该有这些:

CREATE INDEX ON :Infos(id); CREATE INDEX ON :Units(id); CREATE INDEX ON :List(id);

使用这些索引时,查询应该很快,因为大多数情况下您需要通过这些ID查找节点,然后在此基础上执行非常小的操作。即使有100个ID,查询也不是那么难。

对应的是,如果你没有索引你的ID字段,neo4j必须查看其中的大部分/全部来确定要匹配的项目。您拥有的数据越多,此查询的速度就越慢。

如果您将这些内容编入索引并且您仍然看到效果非常慢,则需要EXPLAIN查询并发布计划以获得进一步的反馈。