neo4j在10万个节点上进行Merge查询的性能

时间:2016-02-29 11:08:27

标签: performance neo4j

我最近开始使用neo4j,我在使用Merge查询时遇到了创建图表的性能问题。

我有一个包含100,000条记录的csv文件,并希望从该文件加载数据。 我的加载查询如下:

//Script to import global Actors data
USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "file:///D:/MOT/test_data.csv" AS row
MERGE (c:Country {Name:row.Country})

MERGE (a:Actor {Name: row.ActorName, Aliases: row.Aliases, Type:row.ActorType})

我的系统配置: 8.00 GB RAM和Core i5-3330 CPU。

我的neo4j配置如下:

neostore.nodestore.db.mapped_memory=50M
neostore.relationshipstore.db.mapped_memory=50M
neostore.propertystore.db.mapped_memory=90M
neostore.propertystore.db.strings.mapped_memory=130M
neostore.propertystore.db.arrays.mapped_memory=130M
mapped_memory_page_size=1048576
label_block_size=60
arrat_block_size=120
node_auto_indexing=False
string_block_size=120

当我在neo4j浏览器中运行此查询时,需要一天多的时间。你能帮我解决一下这个问题吗?请让我知道,例如,我是否应该更改我的JVM配置或更改我的查询或...以及如何?

2 个答案:

答案 0 :(得分:2)

要提高MERGE查询的速度,您应该在CREATE INDEX ON :Country(Name) CREATE INDEX ON :Actor(Name) 属性上创建索引:

CREATE CONSTRAINT ON (node:Country) ASSERT node.Name IS UNIQUE
CREATE CONSTRAINT ON (node:Actor) ASSERT node.Name IS UNIQUE

如果您有唯一的节点属性,则可以使用唯一性约束而不是普通索引来提高性能:

MERGE

一般情况下,只有//Script to import global Actors data USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM "file:///D:/MOT/test_data.csv" AS row MERGE (c:Country {Name:row.Country}) MERGE (a:Actor {Name: row.ActorName}) // if necessary, you can set properties here ON CREATE SET a.Aliases = row.Aliases, a.Type = row.ActorType 在单个索引属性上,您的查询才会更快:

function init_foo(){
    class foo{
        function say(){
            echo 'hello';
        }
    }
    $foo1 = new Foo();
    return $foo1;
}

function bar($foo3){
    $foo3->say();
}

$foo2 = init_foo();
bar($foo2);

答案 1 :(得分:0)

正如google小组已经回答的那样。

它应该只需要几秒钟。

我认为:

你使用Neo4j 2.3.2吗? 你为你合并的东西创建了索引/约束? 你配置你的neo4j实例运行至少4G的堆? 你正在使用PERIODIC COMMIT吗?

我建议您在声明中运行个人资料,以查看最大问题出现的位置。

否则,建议将其拆分。

e.g。像这样:

CREATE CONSTRAINT ON (c:Country) ASSERT c.Name IS UNIQUE;
CREATE CONSTRAINT ON (o:Organization) ASSERT o.Name IS UNIQUE;
CREATE CONSTRAINT ON (a:Actor) ASSERT a.Name IS UNIQUE;


LOAD CSV WITH HEADERS FROM "file:///E:/datasets/Actors_data_all.csv" AS row
WITH distinct row.Country as Country
MERGE (c:Country {Name:Country});

LOAD CSV WITH HEADERS FROM "file:///E:/datasets/Actors_data_all.csv" AS row
WITH distinct row.AffiliationTo as AffiliationTo
MERGE (o:Organization {Name: AffiliationTo});

LOAD CSV WITH HEADERS FROM "file:///E:/datasets/Actors_data_all.csv" AS row
MERGE (a:Actor {Name: row.ActorName}) ON CREATE SET a.Aliases=row.Aliases, a.Type=row.ActorType;

LOAD CSV WITH HEADERS FROM "file:///E:/datasets/Actors_data_all.csv" AS row
WITH distinct row.Country as Country, row.ActorName as ActorName
MATCH (c:Country {Name:Country})
MATCH (a:Actor {Name:ActorName})
MERGE(c)<-[:IS_FROM]-(a);

LOAD CSV WITH HEADERS FROM "file:///E:/datasets/Actors_data_all.csv" AS row
MATCH (o:Organization {Name: row.AffiliationTo})
MATCH (a:Actor {Name: row.ActorName})
MERGE (a)-[r:AFFILIATED_TO]->(o) 
  ON CREATE SET r.Start=row.AffiliationStartDate, r.End=row.AffiliationEndDate;