Quantcast
Channel: CodeSection,代码区,数据库(综合) - CodeSec
Viewing all articles
Browse latest Browse all 6262

Mark Needham: Neo4j: Procedure call inside a query does not support passing argu ...

$
0
0

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.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

%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.


Viewing all articles
Browse latest Browse all 6262

Trending Articles