How to return the value generated inside where clause in Cypher?

46 Views Asked by At

I have the following Cypher query:

MATCH (n)-[r]->(k) 
WHERE ANY(x in keys(n) 
    WHERE round(apoc.text.levenshteinSimilarity(
       TRIM(
          REDUCE(mergedString = "", item in n[x] 
               | mergedString + item + " ")), "syn"), 4) 
                   > 0.8) 
RETURN n, r, k

How can I return the score generated inside the WHERE clause by the similarity function.

I am trying to do this with WITH, without luck:

MATCH (n)-[r]->(k) 
WITH *,  [x in keys(n) | [x, round(apoc.text. levenshteinSimilarity(TRIM(REDUCE(mergedString = '', item in n[x] | mergedString + item + ' ')), 'syn'), 4)]] as scores
WHERE [s in scores WHERE s[1] >= 0.8]
RETURN n,r,k,[s in scores WHERE s[1] >= 0.8] AS attr_scores
1

There are 1 best solutions below

6
On BEST ANSWER

To return only relevant attributes with a score > 0.8, update your list comprehension to this:

MATCH (n)-[r]->(k) 
WITH *,  [x in keys(n) | [x, round(apoc.text. levenshteinSimilarity(TRIM(REDUCE(mergedString = '', item in n[x] | mergedString + item + ' ')), 'syn'), 4)]] as scores
RETURN n,r,k,[s in scores WHERE s[1] >= 0.8 | s] AS attr_scores

Finally together with Charchit Kapoor we've found out the best solution:

MATCH (n)-[r]->(k)  
UNWIND keys(n) as key  
WITH n, r, k, key, round(apoc.text. levenshteinSimilarity(TRIM(REDUCE(mergedString = "", item in n[key] | mergedString + item + " ")), "syn"), 4) as score  
WITH n, r, k, collect({key:key, value:n[key], score:score}) as keyScores  
WITH n, r, k, [s in keyScores 
WHERE s.score >= 0.8 | s] AS attr_scores WHERE size(attr_scores) > 0 
RETURN *