Krid
Krid

Reputation: 319

Cypher - How to query multiple Neo4j Node property fragments with "STARTS WITH"

I'm looking for a way to combine the Cypher "IN" and "STARTS WITH" query. In other words I'm looking for a way to look up nodes that start with specific string sequences that are provided as Array using IN.

The goal is to have the query run in as less as possible calls against the DB.

I browsed the documentation and played around with Neo4j a bit but wasn't able to combine the following two queries into one:

MATCH (a:Node_type_A)-[]->(b:Node_type_B) 
WHERE a.prop_A IN [...Array of Strings] 
RETURN a.prop_A, COLLECT ({result_b: b.prop_B})

and

MATCH (a:Node_type_A)-[]->(b:Node_type_B) 
WHERE a.prop_A STARTS WITH 'String' 
RETURN a.prop_A, b.prop_B

Is there a way to combine these two approaches?

Any help is greatly appreciated.

Krid

Upvotes: 1

Views: 820

Answers (2)

InverseFalcon
InverseFalcon

Reputation: 30407

You'll want to make sure there is an index or unique constraint (whichever is appropriate) on your :Node_type_A(prop_A) to speed up your lookups.

If I'm reading your requirements right, this query may work for you, adding your input strings as appropriate (parameterize them if you can).

WITH [...] as inputs
UNWIND inputs as input
// each string in inputs is now on its own row
MATCH (a:Node_type_A)
WHERE a.prop_A STARTS WITH input
// should be an fast index lookup for each input string
WITH a
MATCH (a)-[]->(b:Node_type_B) 
RETURN a.prop_A, COLLECT ({result_b: b.prop_B})

Upvotes: 3

cybersam
cybersam

Reputation: 67019

Something like this should work:

MATCH (a:Node_type_A)-[]->(b:Node_type_B)
WITH a.prop_A AS pa, b.prop_B AS pb
WITH pa, pb,
  REDUCE(s = [], x IN ['a','b','c'] |
   CASE WHEN pa STARTS WITH x THEN s + pb ELSE s END) AS pbs
RETURN pa, pbs;

Upvotes: 0

Related Questions