|
Alireza Rezaei Mahdiraji |
I am Alireza Rezaei Mahdiraji and I am a PhD student. My field or research is database systems.
I am experimenting several databases to support large scale scientific and simulation data. Some of the datasets have an inherent graph structure which make graph databases a good choice for modeling and querying such data.
I picked Neo4j for my modeling tasks because it is an important open source graph database which draw a lot of attentions from database research community and companies. Running a Cypher CREATE command in the Neo4j Shell with a large graph ends to the following error: “argument list too long”. So, how do we execute such large CREATE statement? The solution is use Neo4j Shell transaction facility and break down the original CREATE command into several smaller CREATE command and write the result in a file. An excerpt of the output looks like as follows:
begin
CREATE
(m{n:’m’, d:’3′}),
(f0{n:’f0′, d:’2′}),
m-[:so]->f0
…;
commit
exit
begin
(v20825{n:’v20825′, d:’0′}),
(e102800{n:’e102800′, d:’1′}),
e102800-[:so]->v20624,
…;
commit
exit
…
begin
(v20825{n:’v20825′, d:’0′}),
(e102800{n:’e102800′, d:’1′}),
e102800-[:so]->v20624,
…;
commit
exit
(e198203{n:’e198203′, d:’1′}),
e198203-[:so]->v40000,
e198203-[:so]->v39800,
f39600-[:so]->e198203
…
commit
exit
For a file of 64M, I commit after each 500 node/relationship commands and it works just fine. I tried it with 1000 and I got the same error as above.
After creating the file with CREATE command like example above, stop Neo4j server and import using the following command:
rm -rf data/graph.db && cat path/to/create_statment.cql | ./path/to/neo4j-shell -path data/graph.db
In the command above, create_statment.cql is the name of the file with the CREATE command, graph.db is the folder which Neo4j uses to store the database informations (usually located at /path/to/neo4j-community-XX/data/). The first command just remove existing graph database files.
Now, start the Neo4j server and simply query neo4j to see the data:
START r=node(*) RETURN count(r);
START r=rel(*) RETURN count(r);
To sum up – if you are running long Cypher CREATE commands, be sure to break down the statements to smaller chunks wrapped inside transaction clause to be executable from neo4j-shell.
/Alireza