kkulkarn
kkulkarn

Reputation: 345

Neo4j: Conditional return/IF clause/String manipulation

This is in continuation of Neo4j: Listing node labels

I am constructing a dynamic MATCH statement to return the hierarchy structure & use the output as a Neo4j JDBC input to query the data from a java method:

MATCH p=(:Service)<-[*]-(:Anomaly)
WITH head(nodes(p)) AS Service, p, count(p) AS cnt
RETURN DISTINCT Service.company_id, Service.company_site_id,
"MATCH srvhier=(" +
   reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] +  
    "<-[:BELONGS_TO]-") + ") WHERE Service.company_id = {1} AND
    Service.company_site_id = {2} AND Anomaly.name={3} RETURN " + 
    reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] + ".name,");

The output is as follows:

MATCH srvhier=(Service<-[:BELONGS_TO]-Category<-[:BELONGS_TO]-SubService<-
[:BELONGS_TO]-Assets<-[:BELONGS_TO]-Anomaly<-[:BELONGS_TO]-) WHERE 
Service.company_id = {1} and Service.company_site_id = {21} and 
Anomaly.name={3} RETURN Service.name, Category.name, SubService.name, 
Assets.name, Anomaly.name,

The problem I am seeing:

The "BELONGS_TO" gets appended to my last node

Line 2: Assets<-[:BELONGS_TO]-Anomaly**<-[:BELONGS_TO]-**

Are there string functions (I have looked at Substring..) that can be used to remove it? Or can I use a CASE statement with condition n=cnt to append "BELONGS_TO"?

The same problem persists with my last line:

Line 5: Assets.name,Anomaly.name**,** - the additional "," that I need to eliminate.

Thanks.

Upvotes: 3

Views: 1942

Answers (2)

Dave Bennett
Dave Bennett

Reputation: 11216

I think you need to introduce a case statement into the reduce clause something like this snippet below. If the node isn't the last element of the collection then append the "<-[:BELONGS_TO]-" relationship. If it is the last element then don't append it.

...
reduce(labels = "", n IN nodes(p) | 
CASE
  WHEN n <> nodes(p)[length(nodes(p))-1] THEN
    labels + labels(n)[0] + "<-[:BELONGS_TO]-"
  ELSE
    labels + labels(n)[0]
  END
...

Upvotes: 2

FrobberOfBits
FrobberOfBits

Reputation: 18022

Cypher has a substring function that works basically like you'd expect. An example: here's how you'd return everything but the last three characters of a string:

return substring("hello", 0, length("hello")-3);

(That returns "he")

So you could use substring to trim the last separator off of your query that you don't want.

But I don't understand why you're building your query in such a complex way; you're using cypher to write cypher (which is OK) but (and I don't understand your data model 100%) it seems to me like there's probably an easier way to write this query.

Upvotes: 2

Related Questions