C'è un modo per utilizzare UNWIND per raccolte potenzialmente vuote (ad esempio OPTIONAL UNWIND g)?Cypher: utilizzare UNWIND con una raccolta potenzialmente vuota
Ad esempio, nella query allegata si verifica che la raccolta (elementi) sia vuota a volte (3 ° blocco), ma i risultati delle altre raccolte sono ancora pertinenti.
Qui voglio raggruppare alcuni numeri per un sotto-grafico e restituire i conteggi di vari tipi di nodi (gruppo, utenti, posizione, articolo, gruppi di articoli). I gruppi di articoli possono essere ricavati solo tramite gli articoli. E poiché ci sono così tanti elementi collegati a più utenti, sarebbe molto lento se includessi i gruppi di articoli direttamente nel secondo blocco senza prima aggregarli.
MATCH(group: Group {id: "12345"})
OPTIONAL MATCH(group) - [: IS_PARENT * 0..] - > (subgroup: Group)
WITH collect(distinct subgroup) as groups
UNWIND groups as group
OPTIONAL MATCH(u: User) - [: BELONGS_TO] - > (group)
OPTIONAL MATCH(u) --(i: Item)
OPTIONAL MATCH(u) --(l: Location)
WITH groups, collect(distinct u) as users, collect(distinct i) as items, collect(distinct l) as locations
UNWIND items as i
OPTIONAL MATCH(i) --(ig: FunctionalArea)
RETURN length(groups), length(users), length(items), length(locations), count(distinct ig)
Ho trovato una soluzione, ma non ne sono davvero contento. Quando inserisco un nodo fittizio nella raccolta articoli, posso svolgerlo ogni volta senza perdere i risultati.
MATCH(group: Group {id: "12345"})
OPTIONAL MATCH(group) - [: IS_PARENT * 0..] - > (subgroup: Group)
WITH collect(distinct subgroup) as groups
UNWIND groups as group
OPTIONAL MATCH(u: User) - [: BELONGS_TO] - > (group)
OPTIONAL MATCH(u) --(i: Item)
OPTIONAL MATCH(u) --(l: Location)
WITH groups, collect(distinct u) as users, collect(distinct i) as items, collect(distinct l) as locations
>>
MATCH(ig:ItemGroup)
WITH groups, users, ([head(collect(ig))] + items) as items, locations
<<
UNWIND items as i
OPTIONAL MATCH(i) --(ig: FunctionalArea)
RETURN length(groups), length(users), length(items), length(locations), count(distinct ig)
Sto considerando di scrivere due query separate, ma ciò porterebbe a una logica client complessa.
Tutte le idee e suggerimenti sono molto apprezzati.
Grazie!
Ho avuto questo stesso enigma. Sono andato anche alla radice del nodo 'dummy'. Mancava decisamente l'eleganza ma sembrava funzionare bene. Sarei interessato a conoscere altre potenziali soluzioni, specialmente quelle più eleganti. –