A couple of days I was trying to write a Cypher query to filter the labels in my database.
I started with the following procedure call to get the list of all the labels:
CALL db.labels
%R%P%P%P%P%P%P%P%P%P%P%U │label │ %^%P%P%P%P%P%P%P%P%P%P%a │Airport │ ├──────────┤ │Flight │ ├──────────┤ │Airline │ ├──────────┤ │Movie │ ├──────────┤ │AirportDay│ ├──────────┤ │Person │ ├──────────┤ │Engineer │ └──────────┘
I was only interested in labels that contained the letter ‘a’ so I tweaked the query to filter the output of the procedure:
CALL db.labelsYIELD label
WITH label WHERE tolower(label) contains "a"
RETURN label
Unfortunately that didn’t work as I expected:
Procedure call inside a query does not support passing arguments implicitly (pass explicitly after procedure name instead) (line 1, column 9 (offset: 8)) "CALL db.labels" ^
The mistake I made was calling the procedure implicitly without using parentheses. If you want to do any post processing on the output of a procedure you need to call it explicitly otherwise Cypher gets very confused.
If we add back the parentheses it’s much happier:
CALL db.labels()YIELD label
WITH label WHERE tolower(label) contains "a"
RETURN label
%R%P%P%P%P%P%P%P%P%P%P%U │label │ %^%P%P%P%P%P%P%P%P%P%P%a │Airport │ ├──────────┤ │Airline │ ├──────────┤ │AirportDay│ └──────────┘
It stumped me for a while until I figured out what the error message meant! I think I’ll just use explicit parentheses all the time from now on to save me running into this one again.