is it possible to iterate though property of relat

2019-08-27 13:26发布

问题:

This is related to this question: How to store properties of a neo4j node as an array? I would like to iterate through a property of a relationship and check max of that value and assign a new relationship of node1 and node2 and delete node1 from the pool and move to the second one. In other words as in the context of my previous question, How to assign a given employee to a given position based max(r.score) and move to the other employee who has a maximum r.score for another position? Thanks

Have this basic query to assign a position for the employee who has a maximum r.score w.r.t position and remove him from pool of candidates. However, I have to run this manually for the second position. Ideally I want something that checks length if available positions and then fills positions with max(r.score) and then stops when all positions are filled. may be returns a report of hired employees...

MATCH (e:Employee)-[r:FUTURE_POSITION]->(p:Position) 
WITH MAX(r.score) as s  
MATCH (e)-[r]->(p) WHERE r.score = s 
CREATE (e)-[r2:YOUAREHIRED]->(p)
DELETE r
RETURN e.name, s

回答1:

This query may work for you:

MATCH (:Employee)-[r:FUTURE_POSITION]->(p:Position)
WITH p, COLLECT(r) AS rs
WITH p, REDUCE(t = rs[0], x IN rs[1..] |
  CASE WHEN x.score > t.score THEN x ELSE t END) AS maxR
WITH p, maxR, maxR.score AS maxScore, STARTNODE(maxR) AS e
CREATE (e)-[:YOUAREHIRED]->(p)
DELETE maxR
RETURN p, e.name AS name, maxScore;
  • The first WITH clause collects all the FUTURE_POSITION relationships for each p.
  • The second WITH clause obtains, for each p, the relationship with the maximum score.
  • The third WITH clause extracts the variables needed by subsequent clauses.
  • The CREATE clause creates the YOUAREHIRED relationship between e (the employee with the highest score for a given p) and p.
  • The DELETE clause deletes the FUTURE_POSITION relationship between e and p.
  • The RETURN clause returns each p, along with and the name of the employee who was just hired for p, and his score, maxScore.

[UPDATE]

If you want to delete all FUTURE_POSITION relationships of each p node that gets a YOUAREHIRED relationship, you can use this slightly different query:

MATCH (:Employee)-[r:FUTURE_POSITION]->(p:Position)
WITH p, COLLECT(r) AS rs
WITH p, rs, REDUCE(t = rs[0], x IN rs[1..] |
  CASE WHEN x.score > t.score THEN x ELSE t END) AS maxR
WITH p, rs, maxR.score AS maxScore, STARTNODE(maxR) AS e
CREATE (e)-[:YOUAREHIRED]->(p)
FOREACH(x IN rs | DELETE x)
RETURN p, e.name AS name, maxScore;


标签: neo4j cypher