Gibt es eine Möglichkeit, UNWIND für potenziell leere Sammlungen (z. B. OPTIONAL UNWIND g) zu verwenden?Cypher: Verwenden Sie UNWIND mit potenziell leeren Sammlung
Zum Beispiel kommt es in der angefügten Abfrage vor, dass die Sammlung (Elemente) manchmal leer ist (3. Block), aber die Ergebnisse der anderen Sammlungen sind immer noch relevant.
Hier möchte ich einige Zahlen für ein Sub-Diagramm knacken und die Zählungen der verschiedenen Knotentypen (Gruppe, Benutzer, Ort, Artikel, Artikelgruppen) zurückgeben. Die Itemgroups können nur über die Items abgeleitet werden. Und da so viele Elemente an mehrere Benutzer angehängt sind, wäre es sehr langsam, wenn ich die Elementgruppen direkt in den zweiten Block einschließe, ohne zuerst zu aggregieren.
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)
Ich habe einen Workaround gefunden, aber ich bin nicht wirklich glücklich damit. Wenn ich einen Dummy-Knoten in die Objektauflistung einfüge, kann ich ihn jedes Mal abschalten, ohne die Ergebnisse zu verlieren.
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)
Ich überlege, zwei separate Abfragen zu schreiben, aber das würde zu komplexer Client-Logik führen.
Alle Ideen und Hinweise werden sehr geschätzt.
Danke!
ich diesen gleichen conundrum hatte. Ich habe auch den "Dummy" -Knoten root übernommen. Es fehlte definitiv an Eleganz, aber es schien gut zu funktionieren. Ich würde mich über andere mögliche Lösungen, insbesondere elegantere, interessieren. –