2015-11-08 2 views
3

Я работаю над Neo4j и манипулирую данными, используя их REST API и Cypher.
У меня есть следующий код:Cypher - создать отношения, используя значение вычисления

MATCH (u:USER) WHERE id(u) = 10192 
MATCH (uc:USERS_CLUSTER) WHERE id(uc) = 19618 
MATCH (u)-[r1:HAVE]->(i:ITEM)<-[r2:HAVE]-(u2:USER)-[ic:IN_CLUSTER]->(uc) 
OPTIONAL MATCH (u)-[oldic:IN_CLUSTER]->(uc) 
WHERE (u) <> (u2) 
DELETE oldic 
// --> PROBLEM --> CREAT (u)-[:IN_CLUSTER {score: XXXXXXXXX}]->(uc) 
RETURN id(u),u,id(uc),uc, 
// --> VALUE --> 
((avg(abs(2-abs(r1.rank-r2.rank))*(2-abs(r1.rank-r2.rank)))+4)/8)*100 as calcedMatch 
ORDER BY calcedMatch DESC 

Существует значение calcedMatch я расчетлив, и я в состоянии вернуть его без каких-либо проблем. Но то, что я хотел бы сделать, это создать новое отношение IN_CLUSTER и иметь свойство score со значением calcedMatch (где я помещаю XXXXXXXX). Это возможно?

ответ

3

Целесообразно не использовать идентификатор узла в качестве ссылки; он не является неизменным в контексте назначенного узла или отношения (то есть они могут использоваться повторно, когда объекты уничтожаются).

Я обновил ваш запрос немного. Вам не нужно удалять отношения, а затем воссоздавать их. Вы можете просто использовать MERGE, и он создаст его, если его нет. Затем вы можете установить новый балл после этого.

MATCH (u:USER) WHERE id(u) = 10192 
WITH u 
MATCH (uc:USERS_CLUSTER) WHERE id(uc) = 19618 
WITH uc 
MATCH (u)-[r1:HAVE]->(i:ITEM)<-[r2:HAVE]-(u2:USER)-[ic:IN_CLUSTER]->(uc) 
WHERE (u) <> (u2) 
WITH u, uc, ((avg(abs(2-abs(r1.rank-r2.rank))*(2-abs(r1.rank-r2.rank)))+4)/8)*100 as calcedMatch 
MERGE (u)-[ic:IN_CLUSTER]->(uc) 
set ic.score = calcedMatch 
RETURN id(u),u,id(uc),uc, ic.score 
ORDER BY ic.score DESC 
+1

id неизменен, он повторно используется после удаления :) –

Смежные вопросы