Setting the stack size doesn't seems to work

configuration

(Paolodipietro58) #1

I have this error for a couple of week.
This morning I reload everything from scratch using the new 3.5.

So my environment is:

  • Ubuntu Desktop 18.04.01, with 64GB RAM (dedicated to Neo4j)
  • Neo4j 3.5 CE Server
  • Heap Initial=Max=15G

I reload the DB, but when running the same query as before, I received the following error:

I would like to have some help about how to analize the stack or follow the query execution.
The query is really long.

I changed the stack size definition into the neo4j.conf file, trying both =-Xss4M and =-Xss1G but nothing has changed.

Is there any way to specify BEGIN/COMMIT as in the old version?


(Andrew Bowman) #2

You seldom need very long queries, that seems like a yellow flag to me. How long is the query, and would you be able to share it?


(Paolodipietro58) #3

The query is more than 5700 lines.

if you remember, we already worked on a piece of the query: it must create a node and some links if a person is present or not.

that piece of query is repeated for each person in an excel sheet and in several other connected sheets.

My personal opinion is that I need that each query fragment finish at its end, but the results could be used in the following fragment.

WITH "Di Pietro Chiara-Ginecologa" as calendarName
WITH "Di Pietro Chiara" as fullname, calendarName
MERGE (_cal_178:`Calendario` { `nome`: calendarName })
WITH fullname, calendarName, _cal_178
MATCH (_doctor_178:`Persona`)
WHERE fullname = _doctor_178.nome  + " " + _doctor_178.cognome
   OR fullname = _doctor_178.cognome  + " " + _doctor_178.nome
MERGE (_doctor_178)-[:`utilizza`]->(_cal_178)
RETURN _doctor_178, _cal_178;

WITH "Cinzia Lai" as fullname, _doctor_178, _cal_178
MATCH (_paz_218:`Paziente`)
WHERE fullname = _paz_218.nome  + " " + _paz_218.cognome
   OR fullname = _paz_218.cognome  + " " + _paz_218.nome
CREATE (_evt_218:`Evento` { `inizio`: "20180305T133000Z", `fine`: "20180305T150000Z", `descrizione`: "Visita ostetrica di controllo (80) + ecografia morfologica 3D (160).\nLa paziente ipotizza che la dott.ssa forse voglia aggiungere qualche tampone.", `stato`: "CONFIRMED", `data creazione`: "20181107T192201Z", `uuid`: "1B011C48-2974-C14B-BB65-9CDEDFA5C27A"})
MERGE (_evt_218)<-[:`partecipa`]-(_doctor_178)
MERGE (_evt_218)<-[:`partecipa`]-(_paz_218)
MERGE (_evt_218)-[:`appartiene al`]->(_cal_178)
RETURN _doctor_178, _cal_178;

looking at the above query, I discover how to enable multiple queries.

Then the first one query define a doctor and a doctor's calendar and returns them. They remain constant until the end of the query.

The second (I have thousands) should add an event (an appointment) between a patient and the doctor to the doctor's calendar.
To achieve this result, it must know the doctor and the doctor's calendar, but I don't know how to pass because I cannot add parameters to the query.

By the way, now, with =-Xss2G it run until the end, but returns an error for all the small queries except the first one.


(Andrew Bowman) #4

For Cypher queries, > 50 lines is uncommon, > 100 is definitely a yellow flag, so yours is a red flag for sure, we need to fix this. The goal is to write queries that are stable and constant (in content and size) no matter what the input is and how much data is to be processed. It shouldn't matter if you're processing 1 record, 5 records, or > 5000, the query itself should not change in length or content, just the input parameters to be processed.

You seem to be attempting to put all of this in at once (both calendar creation + linking to doctor and event creation + linking to patient and calendar), but it is far better to process these separately.

First go about dealing with merging of calendars and merging these with the appropriate doctors, and use a batching approach with list parameters as mentioned in Michael Hungers batching tips and tricks, or via LOAD CSV with using periodic commit if your input data is in CSV format. That should result in a query of about 15 lines or less for all of that.

After that's processed you can deal with the creation of events and merging of events to the calendar. Likewise, that part of the query should be 15 lines but likely less.


(Paolodipietro58) #5

OS: Ubuntu server 18.04.01 64 bit / 64 GB RAM / machine dedicated to Neo4j, 15GB Heap, 8GB Stack
Neo4j v 3.5.0

Well, now the configuration is well tuned, the stack size is 8G, the DB has been created on start.

With this just started machine, I run the following two queries:

CALL apoc.schema.assert(
  {Persona:['cognome', 'nome'], Paziente:['cognome', 'nome']
  , Consulente:['cognome', 'nome']
  , Collaboratore:['cognome', 'nome']
  , Prestazione:['nome'] },

  {`Città`:['nome'], `Stato estero`:['nome'], `Titolo di studio`:['nome'], `Facoltà`:['nome']
  , `Persona`:['codice fiscale'], `Collaboratore`:['codice fiscale']
  , `Consulente`:['codice fiscale'], `Paziente`:['codice fiscale']
  , `Specializzazione`:['nome'], `Ruolo`:['nome']
  , `Calendario`:['nome'], `Evento`:['uuid']
  , `Ambito`:['nome']})

YIELD label, key, unique, action
RETURN *

and this is the result:

|action|key|label|unique|
|---|---|---|---|
|"DROPPED"|"nome"|"Consulente"|false|
|"DROPPED"|"cognome"|"Paziente"|false|
|"DROPPED"|"nome"|"Persona"|false|
|"DROPPED"|"cognome"|"Collaboratore"|false|
|"DROPPED"|"nome"|"Prestazione"|false|
|"DROPPED"|"cognome"|"Consulente"|false|
|"DROPPED"|"nome"|"Paziente"|false|
|"DROPPED"|"cognome"|"Persona"|false|
|"DROPPED"|"nome"|"Collaboratore"|false|
|"CREATED"|"cognome"|"Consulente"|false|
|"CREATED"|"nome"|"Consulente"|false|
|"CREATED"|"cognome"|"Paziente"|false|
|"CREATED"|"nome"|"Paziente"|false|
|"CREATED"|"cognome"|"Persona"|false|
|"CREATED"|"nome"|"Persona"|false|
|"CREATED"|"cognome"|"Collaboratore"|false|
|"CREATED"|"nome"|"Collaboratore"|false|
|"CREATED"|"nome"|"Prestazione"|false|
|"KEPT"|"codice fiscale"|"Paziente"|true|
|"KEPT"|"codice fiscale"|"Consulente"|true|
|"KEPT"|"nome"|"Calendario"|true|
|"KEPT"|"nome"|"Città"|true|
|"KEPT"|"nome"|"Specializzazione"|true|
|"KEPT"|"nome"|"Stato estero"|true|
|"KEPT"|"codice fiscale"|"Collaboratore"|true|
|"KEPT"|"nome"|"Facoltà"|true|
|"KEPT"|"nome"|"Ambito"|true|
|"KEPT"|"codice fiscale"|"Persona"|true|
|"KEPT"|"nome"|"Titolo di studio"|true|
|"KEPT"|"nome"|"Ruolo"|true|
|"KEPT"|"uuid"|"Evento"|true|

Then the first query:

merge (_0:`Organizzazione` {`nome`: "Io Donna"});

merge (_200:`Persona`:`Consulente` { `cognome`: "Abbruzzese", `nome`: "Claudia", `codice fiscale`: "AA"})
merge (_200)-[:`ha riferimenti`]->(:`Recapito` {`email`: "abruzzeseclaudia@gmail.com"})
merge (_2013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_2014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_2013)-[:`in`]->(_2014)
merge (_2015:`Specializzazione` {`nome`: "Dermatologia e Venereologia"})
merge (_2014)-[:`con specializzazione in`]->(_2015)
merge (_200)-[:`è specializzata in`]->(_2015)
merge (_2016:`Ruolo` {`nome`: "Dermatologa"})
merge (_200)-[:`svolge il ruolo di` ]->(_2016)
merge (_2016)-[:`ha una relazione presso`]->(_0)

merge (_300:`Persona`:`Consulente` { `cognome`: "Casto", `nome`: "Valentina", `codice fiscale`: "CA"})
merge (_300)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3400630894", `email`: "valentina.casto@yahoo.it"})
merge (_3013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_3014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_3013)-[:`in`]->(_3014)
merge (_3015:`Specializzazione` {`nome`: "Otorinolaringoiatria"})
merge (_3014)-[:`con specializzazione in`]->(_3015)
merge (_300)-[:`è specializzata in`]->(_3015)
merge (_3016:`Ruolo` {`nome`: "Otorino"})
merge (_300)-[:`svolge il ruolo di` ]->(_3016)
merge (_3016)-[:`ha una relazione presso`]->(_0)

merge (_400:`Persona`:`Consulente` { `cognome`: "Chiechi", `nome`: "Antonella", `codice fiscale`: "CHI"})
merge (_400)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3288452360", `email`: "dott.chiechi@tiscali.it"})
merge (_4013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_4014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_4013)-[:`in`]->(_4014)
merge (_4015:`Specializzazione` {`nome`: "Endocrinologia e malattie del metabolismo"})
merge (_4014)-[:`con specializzazione in`]->(_4015)
merge (_400)-[:`è specializzata in`]->(_4015)
merge (_4016:`Ruolo` {`nome`: "Endocrinologa "})
merge (_400)-[:`svolge il ruolo di` ]->(_4016)
merge (_4016)-[:`ha una relazione presso`]->(_0)

merge (_500:`Persona`:`Consulente` { `cognome`: "Cistriani", `nome`: "Gloria", `codice fiscale`: "CIS"})
merge (_500)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3911227068", `email`: "cistrianigloria@gmail.com"})
merge (_5013:`Titolo di studio` {`nome`: "Laurea Triennale"})
merge (_5014:`Facoltà` {`nome`: "Professioni Sanitarie"})
merge (_5013)-[:`in`]->(_5014)
merge (_5015:`Specializzazione` {`nome`: "Ostetricia"})
merge (_5014)-[:`con specializzazione in`]->(_5015)
merge (_500)-[:`è specializzata in`]->(_5015)
merge (_5016:`Ruolo` {`nome`: "Ostetrica"})
merge (_500)-[:`svolge il ruolo di` ]->(_5016)
merge (_5016)-[:`ha una relazione presso` {  `relazione`: "prestazione", `importo`: "400"}]->(_0)

merge (_600:`Persona`:`Consulente` { `cognome`: "Corsetti", `nome`: "Tiziana", `codice fiscale`: "COR"})
merge (_600)-[:`ha riferimenti`]->(:`Recapito` {`email`: "corsetti.tiz@gmail.com"})
merge (_6013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_6014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_6013)-[:`in`]->(_6014)
merge (_6015:`Specializzazione` {`nome`: "Gastroenterologia"})
merge (_6014)-[:`con specializzazione in`]->(_6015)
merge (_600)-[:`è specializzata in`]->(_6015)
merge (_6016:`Ruolo` {`nome`: "Gastroenterologa"})
merge (_600)-[:`svolge il ruolo di` ]->(_6016)
merge (_6016)-[:`ha una relazione presso`]->(_0)

merge (_700:`Persona`:`Consulente` { `cognome`: "Di Pietro", `nome`: "Chiara", `data di nascita`: "25/03/1984", `codice fiscale`: "DPTCHR"})
merge (_703:`Città` {`nome`: "Milano"})
merge (_700)-[:`è nata a`]->(_703)
merge (_708:`Città` {`nome`: "Roma"})
merge (_700)-[:`è residente in` {`via`: "Via Talete, 43", `cap`: "00124" }]->(_708)
merge (_700)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3297759384", `email`: "chiaradipietro84@gmail.com"})
merge (_7013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_7014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_7013)-[:`in`]->(_7014)
merge (_7015:`Specializzazione` {`nome`: "Ginecologia ed Ostetricia"})
merge (_7014)-[:`con specializzazione in`]->(_7015)
merge (_700)-[:`è specializzata in`]->(_7015)
merge (_7016:`Ruolo` {`nome`: "Ginecologa"})
merge (_700)-[:`svolge il ruolo di` ]->(_7016)
merge (_7016)-[:`ha una relazione presso` {  `relazione`: "comodato gratuito"}]->(_0)

merge (_800:`Persona`:`Consulente` { `cognome`: "Giammattei", `nome`: "Elena", `codice fiscale`: "GIA"})
merge (_800)-[:`ha riferimenti`]->(:`Recapito` {`email`: "elena.giammattei@libero.it"})
merge (_8013:`Titolo di studio` {`nome`: "Laurea Triennale"})
merge (_8014:`Facoltà` {`nome`: "Professioni Sanitarie"})
merge (_8013)-[:`in`]->(_8014)
merge (_8015:`Specializzazione` {`nome`: "Fisioterapia"})
merge (_8014)-[:`con specializzazione in`]->(_8015)
merge (_800)-[:`è specializzata in`]->(_8015)
merge (_8016:`Ruolo` {`nome`: "Fisioterapista"})
merge (_800)-[:`svolge il ruolo di` ]->(_8016)
merge (_8016)-[:`ha una relazione presso`]->(_0)

merge (_900:`Persona`:`Consulente` { `cognome`: "Grosso", `nome`: "Albina", `codice fiscale`: "GRSLBN82M71F205H"})
merge (_900)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3402438806", `email`: "albinagrosso@gmail.com"})
merge (_9013:`Titolo di studio` {`nome`: "Laurea Triennale"})
merge (_9014:`Facoltà` {`nome`: "Professioni Sanitarie"})
merge (_9013)-[:`in`]->(_9014)
merge (_9015:`Specializzazione` {`nome`: "Fisioterapia"})
merge (_9014)-[:`con specializzazione in`]->(_9015)
merge (_900)-[:`è specializzata in`]->(_9015)
merge (_9016:`Ruolo` {`nome`: "Fisioterapista"})
merge (_900)-[:`svolge il ruolo di` ]->(_9016)
merge (_9016)-[:`ha una relazione presso`]->(_0)

merge (_1000:`Persona`:`Consulente` { `cognome`: "Morelli", `nome`: "Monica", `codice fiscale`: "MOR"})
merge (_1000)-[:`ha riferimenti`]->(:`Recapito` {`email`: "monicamorelli26@gmail.com"})
merge (_10013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_10014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_10013)-[:`in`]->(_10014)
merge (_10015:`Specializzazione` {`nome`: "Chirurgia Vascolare"})
merge (_10014)-[:`con specializzazione in`]->(_10015)
merge (_1000)-[:`è specializzata in`]->(_10015)
merge (_10016:`Ruolo` {`nome`: "Angiologa"})
merge (_1000)-[:`svolge il ruolo di` ]->(_10016)
merge (_10016)-[:`ha una relazione presso` {  `relazione`: "percentuale", `importo`: "0,25"}]->(_0)

Here is the breakpoint: until here the query run, but if I add one more item, it fails.

merge (_1100:`Persona`:`Consulente` { `cognome`: "Palini", `nome`: "ComeSeChiama", `codice fiscale`: "PAL"})
merge (_11013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_11014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_11013)-[:`in`]->(_11014)
merge (_11015:`Specializzazione` {`nome`: "Osteopatia"})
merge (_11014)-[:`con specializzazione in`]->(_11015)
merge (_1100)-[:`è specializzata in`]->(_11015)
merge (_11016:`Ruolo` {`nome`: "Osteopata"})
merge (_1100)-[:`svolge il ruolo di` ]->(_11016)
merge (_11016)-[:`ha una relazione presso`]->(_0)

merge (_1200:`Persona`:`Consulente` { `cognome`: "Rossi", `nome`: "Maria", `codice fiscale`: "ROS"})
merge (_12013:`Titolo di studio` {`nome`: "Laurea Triennale"})
merge (_12014:`Facoltà` {`nome`: "Scienze"})
merge (_12013)-[:`in`]->(_12014)
merge (_12015:`Specializzazione` {`nome`: "Scienze Biologiche"})
merge (_12014)-[:`con specializzazione in`]->(_12015)
merge (_1200)-[:`è specializzata in`]->(_12015)
merge (_12016:`Ruolo` {`nome`: "Nutrizionista"})
merge (_1200)-[:`svolge il ruolo di` ]->(_12016)
merge (_12016)-[:`ha una relazione presso`]->(_0)

merge (_1300:`Persona`:`Consulente` { `cognome`: "Ruggiero", `nome`: "Alessandra", `codice fiscale`: "RUG"})
merge (_13013:`Titolo di studio` {`nome`: "Laurea Magistrale"})
merge (_13014:`Facoltà` {`nome`: "Medicina e chirurgia"})
merge (_13013)-[:`in`]->(_13014)
merge (_13015:`Specializzazione` {`nome`: "Endocrinologia e malattie del metabolismo"})
merge (_13014)-[:`con specializzazione in`]->(_13015)
merge (_1300)-[:`è specializzata in`]->(_13015)
merge (_13016:`Ruolo` {`nome`: "Endocrinologa "})
merge (_1300)-[:`svolge il ruolo di` ]->(_13016)
merge (_13016)-[:`ha una relazione presso`]->(_0)

which returns an awesome

merge (_0:`Organizzazione` {`nome`: "Io Donna"})

merge (_200:`Persona`:`Consulente` { `cognome`: "Abbruzzese", `nome`: "Claudia", `codice fiscale`: "AA"}) merge (_200)-[:`ha riferimenti`]->(:`Recapito` {`email`: "abruzzeseclaudia@gmail.com"}) merge (_2013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_2014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_2013)-[:`in`]->(_2014) merge (_2015:`Specializzazione` {`nome`: "Dermatologia e Venereologia"}) merge (_2014)-[:`con specializzazione in`]->(_2015) merge (_200)-[:`è specializzata in`]->(_2015) merge (_2016:`Ruolo` {`nome`: "Dermatologa"}) merge (_200)-[:`svolge il ruolo di` ]->(_2016) merge (_2016)-[:`ha una relazione presso`]->(_0) merge (_300:`Persona`:`Consulente` { `cognome`: "Casto", `nome`: "Valentina", `codice fiscale`: "CA"}) merge (_300)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3400630894", `email`: "valentina.casto@yahoo.it"}) merge (_3013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_3014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_3013)-[:`in`]->(_3014) merge (_3015:`Specializzazione` {`nome`: "Otorinolaringoiatria"}) merge (_3014)-[:`con specializzazione in`]->(_3015) merge (_300)-[:`è specializzata in`]->(_3015) merge (_3016:`Ruolo` {`nome`: "Otorino"}) merge (_300)-[:`svolge il ruolo di` ]->(_3016) merge (_3016)-[:`ha una relazione presso`]->(_0) merge (_400:`Persona`:`Consulente` { `cognome`: "Chiechi", `nome`: "Antonella", `codice fiscale`: "CHI"}) merge (_400)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3288452360", `email`: "dott.chiechi@tiscali.it"}) merge (_4013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_4014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_4013)-[:`in`]->(_4014) merge (_4015:`Specializzazione` {`nome`: "Endocrinologia e malattie del metabolismo"}) merge (_4014)-[:`con specializzazione in`]->(_4015) merge (_400)-[:`è specializzata in`]->(_4015) merge (_4016:`Ruolo` {`nome`: "Endocrinologa "}) merge (_400)-[:`svolge il ruolo di` ]->(_4016) merge (_4016)-[:`ha una relazione presso`]->(_0) merge (_500:`Persona`:`Consulente` { `cognome`: "Cistriani", `nome`: "Gloria", `codice fiscale`: "CIS"}) merge (_500)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3911227068", `email`: "cistrianigloria@gmail.com"}) merge (_5013:`Titolo di studio` {`nome`: "Laurea Triennale"}) merge (_5014:`Facoltà` {`nome`: "Professioni Sanitarie"}) merge (_5013)-[:`in`]->(_5014) merge (_5015:`Specializzazione` {`nome`: "Ostetricia"}) merge (_5014)-[:`con specializzazione in`]->(_5015) merge (_500)-[:`è specializzata in`]->(_5015) merge (_5016:`Ruolo` {`nome`: "Ostetrica"}) merge (_500)-[:`svolge il ruolo di` ]->(_5016) merge (_5016)-[:`ha una relazione presso` { `relazione`: "prestazione", `importo`: "400"}]->(_0) merge (_600:`Persona`:`Consulente` { `cognome`: "Corsetti", `nome`: "Tiziana", `codice fiscale`: "COR"}) merge (_600)-[:`ha riferimenti`]->(:`Recapito` {`email`: "corsetti.tiz@gmail.com"}) merge (_6013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_6014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_6013)-[:`in`]->(_6014) merge (_6015:`Specializzazione` {`nome`: "Gastroenterologia"}) merge (_6014)-[:`con specializzazione in`]->(_6015) merge (_600)-[:`è specializzata in`]->(_6015) merge (_6016:`Ruolo` {`nome`: "Gastroenterologa"}) merge (_600)-[:`svolge il ruolo di` ]->(_6016) merge (_6016)-[:`ha una relazione presso`]->(_0) merge (_700:`Persona`:`Consulente` { `cognome`: "Di Pietro", `nome`: "Chiara", `data di nascita`: "25/03/1984", `codice fiscale`: "DPTCHR"}) merge (_703:`Città` {`nome`: "Milano"}) merge (_700)-[:`è nata a`]->(_703) merge (_708:`Città` {`nome`: "Roma"}) merge (_700)-[:`è residente in` {`via`: "Via Talete, 43", `cap`: "00124" }]->(_708) merge (_700)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3297759384", `email`: "chiaradipietro84@gmail.com"}) merge (_7013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_7014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_7013)-[:`in`]->(_7014) merge (_7015:`Specializzazione` {`nome`: "Ginecologia ed Ostetricia"}) merge (_7014)-[:`con specializzazione in`]->(_7015) merge (_700)-[:`è specializzata in`]->(_7015) merge (_7016:`Ruolo` {`nome`: "Ginecologa"}) merge (_700)-[:`svolge il ruolo di` ]->(_7016) merge (_7016)-[:`ha una relazione presso` { `relazione`: "comodato gratuito"}]->(_0) merge (_800:`Persona`:`Consulente` { `cognome`: "Giammattei", `nome`: "Elena", `codice fiscale`: "GIA"}) merge (_800)-[:`ha riferimenti`]->(:`Recapito` {`email`: "elena.giammattei@libero.it"}) merge (_8013:`Titolo di studio` {`nome`: "Laurea Triennale"}) merge (_8014:`Facoltà` {`nome`: "Professioni Sanitarie"}) merge (_8013)-[:`in`]->(_8014) merge (_8015:`Specializzazione` {`nome`: "Fisioterapia"}) merge (_8014)-[:`con specializzazione in`]->(_8015) merge (_800)-[:`è specializzata in`]->(_8015) merge (_8016:`Ruolo` {`nome`: "Fisioterapista"}) merge (_800)-[:`svolge il ruolo di` ]->(_8016) merge (_8016)-[:`ha una relazione presso`]->(_0) merge (_900:`Persona`:`Consulente` { `cognome`: "Grosso", `nome`: "Albina", `codice fiscale`: "GRSLBN82M71F205H"}) merge (_900)-[:`ha riferimenti`]->(:`Recapito` {`cellulare`: "3402438806", `email`: "albinagrosso@gmail.com"}) merge (_9013:`Titolo di studio` {`nome`: "Laurea Triennale"}) merge (_9014:`Facoltà` {`nome`: "Professioni Sanitarie"}) merge (_9013)-[:`in`]->(_9014) merge (_9015:`Specializzazione` {`nome`: "Fisioterapia"}) merge (_9014)-[:`con specializzazione in`]->(_9015) merge (_900)-[:`è specializzata in`]->(_9015) merge (_9016:`Ruolo` {`nome`: "Fisioterapista"}) merge (_900)-[:`svolge il ruolo di` ]->(_9016) merge (_9016)-[:`ha una relazione presso`]->(_0) merge (_1000:`Persona`:`Consulente` { `cognome`: "Morelli", `nome`: "Monica", `codice fiscale`: "MOR"}) merge (_1000)-[:`ha riferimenti`]->(:`Recapito` {`email`: "monicamorelli26@gmail.com"}) merge (_10013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_10014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_10013)-[:`in`]->(_10014) merge (_10015:`Specializzazione` {`nome`: "Chirurgia Vascolare"}) merge (_10014)-[:`con specializzazione in`]->(_10015) merge (_1000)-[:`è specializzata in`]->(_10015) merge (_10016:`Ruolo` {`nome`: "Angiologa"}) merge (_1000)-[:`svolge il ruolo di` ]->(_10016) merge (_10016)-[:`ha una relazione presso` { `relazione`: "percentuale", `importo`: "0,25"}]->(_0) merge (_1100:`Persona`:`Consulente` { `cognome`: "Palini", `nome`: "ComeSeChiama", `codice fiscale`: "PAL"}) merge (_11013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_11014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_11013)-[:`in`]->(_11014) merge (_11015:`Specializzazione` {`nome`: "Osteopatia"}) merge (_11014)-[:`con specializzazione in`]->(_11015) merge (_1100)-[:`è specializzata in`]->(_11015) merge (_11016:`Ruolo` {`nome`: "Osteopata"}) merge (_1100)-[:`svolge il ruolo di` ]->(_11016) merge (_11016)-[:`ha una relazione presso`]->(_0) merge (_1200:`Persona`:`Consulente` { `cognome`: "Rossi", `nome`: "Maria", `codice fiscale`: "ROS"}) merge (_12013:`Titolo di studio` {`nome`: "Laurea Triennale"}) merge (_12014:`Facoltà` {`nome`: "Scienze"}) merge (_12013)-[:`in`]->(_12014) merge (_12015:`Specializzazione` {`nome`: "Scienze Biologiche"}) merge (_12014)-[:`con specializzazione in`]->(_12015) merge (_1200)-[:`è specializzata in`]->(_12015) merge (_12016:`Ruolo` {`nome`: "Nutrizionista"}) merge (_1200)-[:`svolge il ruolo di` ]->(_12016) merge (_12016)-[:`ha una relazione presso`]->(_0) merge (_1300:`Persona`:`Consulente` { `cognome`: "Ruggiero", `nome`: "Alessandra", `codice fiscale`: "RUG"}) merge (_13013:`Titolo di studio` {`nome`: "Laurea Magistrale"}) merge (_13014:`Facoltà` {`nome`: "Medicina e chirurgia"}) merge (_13013)-[:`in`]->(_13014) merge (_13015:`Specializzazione` {`nome`: "Endocrinologia e malattie del metabolismo"}) merge (_13014)-[:`con specializzazione in`]->(_13015) merge (_1300)-[:`è specializzata in`]->(_13015) merge (_13016:`Ruolo` {`nome`: "Endocrinologa "}) merge (_1300)-[:`svolge il ruolo di` ]->(_13016) merge (_13016)-[:`ha una relazione presso`]->(_0)

**Neo.TransientError.General.StackOverFlowError: There is not enough stack size to perform the current task. This is generally considered to be a database error, so please contact Neo4j support. You could try increasing the stack size: for example to set the stack size to 2M, add `dbms.jvm.additional=-Xss2M' to in the neo4j configuration (normally in 'conf/neo4j.conf' or, if you are using Neo4j Desktop, found through the user interface) or if you are running an embedded installation just add -Xss2M as command line flag.**

(Andrew Bowman) #6

As previously mentioned, this is the wrong approach to use for writing Cypher queries. It's tedious to write out a query with potentially thousands of individual variables, it's not efficient or performant.

Please read the link I provided on using small Cypher queries using batched input to handle these cases. You also need to be using parameters for this.

As an example using a sample from your query:

// assume $data is a parameter provided that is a list of maps of person data to insert, say 10k or so entries in the list, and $organizzazione is the organization name, used for all entries
MERGE (organizzazione:`Organizzazione` {`nome`: $organizzazione})
WITH organizzazione
UNWIND $data as dataEntry
WITH organizzazione, dataEntry.persona as personaData, dataEntry.studio as studioData
MERGE (persona:`Persona`:`Consulente` {`cognome`:personaData.cognome, `nome`:personaData.nome, `codice fiscale`:personaData.codice_fiscale})
MERGE (studio:`Titolo di studio` {`nome`:studioData.nome})
MERGE (facolta:`Facoltá` {`nome`:studioData.facolta_nome})
MERGE (studio)-[:`in`]->(facolta)
MERGE (specializzazione:`Specializzazione` {`nome`:personaData.specializzazione})
MERGE (facolta)-[:`con specializzazione in`]->(specializzazione)
MERGE (persona)-[:`è specializzata in`]->(specializzazione)
MERGE (ruolo:`Ruolo` {`nome`: personaData.ruolo})
MERGE (person)-[:`svolge il ruolo di` ]->(ruolo) 
MERGE (ruolo)-[:`ha una relazione presso`]->(organizzazione)
MERGE (ruolo:`Ruolo` {`nome`: personaData.ruolo})
MERGE (person)-[:`svolge il ruolo di` ]->(ruolo) 
MERGE (ruolo)-[:`ha una relazione presso`]->(organizzazione)

This ~15 line query would handle the merging of nodes and relationships for those 10k entries in the batch.

That said, you have some variance between entries, some residence data, or contact info, that may or may not be present. If you could have this optional data as maps within list fields in the personaData field, you could run a FOREACH on those lists, allowing you to apply the merges you need in the case that such data is present. If the list is empty, then those operations won't happen.

I hope this illustrates the overall idea, in that you need to structure and collect your data into entries in a list parameter so you an UNWIND the list and use a small number of variables to address the relevant parts of all entries in the batch. Your current approach isn't feasible and shouldn't be used.


(Paolodipietro58) #7

Hi Andrew,

Yes, I know and I’m approaching the problem as you suggested.

But, as I was installing Neo4j an a new, dedicated and performing machine, I was using the old query just to test, and I’ll the example. I send you, there were only around 12 items.

The question is if it is correct to receive a stackoverflow with such a short query and 8G of stacksize.

A secondary question is: there is a way to allow neo4j or the underlying java machine, to address all the available machine without the need of a preallocation?

The machine has 64GB ram and run only Ubuntu server with neo4j.


(Andrew Bowman) #8

Can you explicitly provide the query you're using to test? I'm interested in the count of unique variables you use in the query.


(Paolodipietro58) #9

The one in the first message: there are 2 items:

A) the apocalypse call to define keys, index ...
B) the entire quuery that produces the stack overflow

The line when, with 8G stack size, it exactly produce the error on my machine.


(Andrew Bowman) #10

Again, Neo4j isn't made to handle several dozen variables in the same query. While we can have engineering look at it, again it comes down to the fact that this is a misuse of the language.

If you were using an imperative language, you wouldn't hardcode your logic for hundreds of lines with dozens of variables, you would use a loop structure on the input for a total of < 20 lines with just a few variables. It's the same idea here.


(Paolodipietro58) #11

I agree with you, in line of principle.

WIth an old imperative language I should have reused the variable names, having so no more than 10 vars and 20 lines.

Using XSLT, just for example, I cannot reuse variable name, because variables cannot be assigned but not modified (the name 'variable' itself is an error: they are constant!)

With Cypher I cannot reassign a variable, isn't it?
This is the reason of the thousands of variables.

Maybe they could be re-assigned or un-used, allowing the programmer to reuse them ....

But this is just a discussion wth no meaning!

Ciao e grazie!

Paolo


(Andrew Bowman) #12

In Neo4j we wouldn't use variable assignment, no, but the link I provided earlier shows how you can use UNWIND on a list parameter of maps for the same effect: use only a small handful of variables to process thousands of rows of input. The Cypher query is applied to every entry in the batch. Please read the linked article.


Fast Batched Updates of Graph Structures with Neo4j and Cypher