Neo4j: Procedure call inside a query does not support passing arguments implicitly (pass explicitly after procedure name instead)
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
╒══════════╕
│label │
╞══════════╡
│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.labels
YIELD 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
╒══════════╕
│label │
╞══════════╡
│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.
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.