MATCH (p:Person) WHERE p.name =~ '(?i).test.*'
WITH COLLECT(DISTINCT {name: p.name}) as persons
OPTIONAL MATCH (pla:Place) WHERE pla.name =~ '(?i).*test.*'
RETURN persons, [x IN COLLECT(DISTINCT pla) | {name: x.name}] as placesOn Tue, Nov 28, 2017 at 11:56 AM, <[email protected]> wrote: > OK thank you. > > Actually, the null value is "added" when I use COLLECT. So I can't really > filter the null values. > If I filter before the collect there is no null value yet. And if I filter > on the collect result, there is no null item, because an object is create > with the name property which is null. > It cannot return an empty array for one COLLECT and have results in the > other... I don't understand why. > > I do the following workaround using UNION ALL: > > MATCH (p:Person) WHERE p.name =~ '(?i).*test.*' > return {persons: COLLECT(DISTINCT {name: p.name})} as results > UNION ALL MATCH (pla:Place) WHERE pla.name =~ '(?i).*test.*' > return {places: COLLECT(DISTINCT {name: pla.name})} as results > > I get this: > > ╒═════════════════════════════════════════════════════════════╕ > │"results" │ > ╞═════════════════════════════════════════════════════════════╡ > │{"persons":[]} │ > ├─────────────────────────────────────────────────────────────┤ > │{"places":[{"name":"Test 1"},{"name":"Test 2"}]} │ > └─────────────────────────────────────────────────────────────┘ > > > > I am surprised there is no way to have two separated keys "persons" and > "places" which contains an array of objects like this: > > ╒═══════════════╤═════════════════════════════════════════════════╕ > │"persons" │"places" │ > ╞═══════════════╪═════════════════════════════════════════════════╡ > │[ ] │[{"name":"Test 1"},{"name":"Test 2"}] │ > └───────────────┴─────────────────────────────────────────────────┘ > > > It adds this object in "persons" if I use OPTIONAL: > > {"name":null} > > > Without OPTIONAL, "places" is empty. > > Any idea to achieve this ? > > > Thank you. > > Le mardi 28 novembre 2017 09:44:44 UTC+1, Michael Hunger a écrit : >> >> WITH a UNION as those 2 queries are unrelated. >> >> If you use your approach you also compute a cross product. >> It would be better to aggregate first >> >> MATCH (p:Person) WHERE p.name =~ '(?i).test.*' >> WITH COLLECT(DISTINCT {name: p.name}) as persons >> OPTIONAL MATCH (pla:Place) WHERE pla.name =~ '(?i).*test.*' >> return persons, COLLECT(DISTINCT {name: pla.name}) as places >> >> Empty matches only return any data rows when you return a single >> aggregation, like your collect, otherwise they will just result in no rows. >> (You can just filter out the null value from the optional match) >> >> In general aggregation functions skip null values. >> >> The regular expression match is not very efficient, as it has to scan the >> full label. >> >> >> On Mon, Nov 27, 2017 at 10:01 AM, <[email protected]> wrote: >> >>> Hi, >>> >>> I'm trying to find nodes matching a text in their name. >>> >>> For one node I do : >>> >>> MATCH (p:Person) WHERE p.name =~ '(?i).test.*' >>> WITH p, {name: p.name} as person >>> return COLLECT(DISTINCT person) as persons >>> >>> It works well. >>> >>> >>> But if I try for two nodes : >>> >>> MATCH (p:Person) WHERE p.name =~ '(?i).test.*' >>> WITH p, {name: p.name} as person >>> MATCH (pla:Place) WHERE pla.name =~ '(?i).*test.*' >>> WITH person, {name: pla.name} as place >>> return COLLECT(DISTINCT person) as persons, COLLECT(DISTINCT place) as >>> places >>> >>> If the first MATCH returns nothing the the entire query result is empty >>> even if the the second should return results. >>> >>> >>> I tried to add OPTIONAL, the result is not empty, the MATCH returns >>> expected objects but I get an object with name null for the MATCH which >>> should be empty : >>> >>> [ >>> { >>> "name": null >>> } >>> ] >>> >>> >>> >>> How can I get the results for the MATCH which should has results and get >>> an empty array for the one which should not have result ? >>> >>> Thank you. >>> >>> Regards, >>> Clément >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Neo4j" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to the Google Groups > "Neo4j" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
