是否有可能迭代关系密码的属性

时间:2018-06-17 21:12:52

标签: neo4j cypher

这与此问题有关:How to store properties of a neo4j node as an array? 我想迭代关系的属性并检查该值的最大值并分配node1和node2的新关系,并从池中删除node1并移至第二个。换句话说,就像我上一个问题的背景一样,如何根据max(r.score)将给定员工分配到给定职位,并转移到另一个具有最大r.score的员工?感谢

让这个基本查询为具有最大r.score w.r.t位置的员工分配一个职位,并将他从候选人库中删除。但是,我必须手动运行第二个位置。理想情况下,我想要一些东西,如果可用的位置检查长度,然后用max(r.score)填充位置,然后在所有位置都填满时停止。可能会返回雇佣员工的报告......

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 个答案:

答案 0 :(得分:0)

此查询可能对您有用:

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;
  • 第一个WITH子句收集每个FUTURE_POSITION的所有p关系。
  • 第二个WITH子句为每个p获取具有最大score的关系。
  • 第三个WITH子句提取后续子句所需的变量。
  • CREATE子句在YOUAREHIRED(给定e得分最高的员工)和p之间创建p关系。
  • DELETE子句删除FUTURE_POSITIONe之间的p关系。
  • RETURN子句返回每个p,以及刚被name雇用的雇员的p和他的得分maxScore

[更新]

如果您要删除获得FUTURE_POSITION关系的每个p节点的全部 YOUAREHIRED关系,则可以使用以下稍微不同的查询:

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;