Je suis nouveau sur Neo4j et il doit y avoir quelque chose que je ne comprends pas sur les bases.Neo4j, chargement en masse avec commandes Cypher
J'ai beaucoup d'objets en Java et je veux les utiliser pour remplir un graphique Neo4j, en utilisant le pilote Java et Cypher. Mon code fonctionne comme ceci:
// nodes
for (Person person: persons)
session.run (String.format (
"CREATE (:Person { id: '%s', name: \"%s\", surname: \"%s\" })",
person.getId(), person.getName(), person.getSurname()
));
// relations
session.run ("CREATE INDEX ON :Person(id)");
for (Friendship friendship: friendships)
session.run (String.format (
"MATCH (from:Person { id: '%s' }), (to:Person { id: '%s' })\n" +
"CREATE (from)-:KNOWS->(to)\n",
friendship.getFrom().getId(),
friendship.getTo().getId()
));
(en effet, il est un peu plus compliqué, parce que j'ai une douzaine de types de nœuds et environ le même nombre de types de relation). Maintenant, c'est très lent, comme plus de 1 heure pour charger 300k nœuds et 1M relations (sur un MacBookPro assez rapide, avec Neo4j prenant 12/16GB de RAM).
Suis-je dans le mauvais sens? Devrais-je utiliser le batch inserter à la place? (Je préférerais pouvoir accéder au graphDB via le réseau). Est-ce que je gagnerais quelque chose en regroupant plus d'insertions dans une transaction? (De la documentation, il semble que les transactions ne sont utiles que pour les besoins de retour en arrière et d'isolation).
Merci, mais je ne pense pas que ça marcherait dans mon cas. 24-15ms ne sont pas très différents, étant donné que mon application est de remplir son graphique interne (en utilisant des cartes de hachage) en moins de 3 minutes, alors que Neo4j prend autant de temps à faire de même. Cela ne peut pas être juste, cela devrait prendre plus ou moins la même chose. En ce qui concerne WIND, je pense que l'envoi d'une liste en tant que paramètre finirait par devenir une requête trop importante, étant donné que j'ai tellement de nœuds et d'arêtes. – zakmck
Mon benchmark est peut-être éteint, mais je suggère fortement au moins d'essayer UNWIND. Votre liste de charge utile ne doit pas nécessairement être * toutes * vos données, vous pouvez les découper (comme je le fais dans la pratique, pas dans le code ci-dessus). Si la charge utile est de taille ~ 100k et que vous pouvez remplir vos bords avec N transactions, cela vous fera gagner beaucoup de temps par rapport aux transactions individuelles N * 100k. – sjc
merci @sjc, je vois le point sur UNWIND, je vais essayer. – zakmck