Neo4J COALESCE в отношениях - PullRequest
       9

Neo4J COALESCE в отношениях

0 голосов
/ 09 февраля 2020

Я пытаюсь запустить создание отношений, но по какой-то причине я не могу использовать объединение внутри моего запроса отношений. Я полностью застрял, и некоторые из них могут быть повреждены, но я пытаюсь исправить это по одному шагу за раз. вот мой код

/* Get the kill assassin and student by relation UUID*/
'MATCH (a:Student)-[r:TARGET]->(t:Student) WHERE r.uuid = $uuid ' +
/* Lets Kill the student and set confirmed to true */
'SET r.confirmed = true, t.IsDead = true WITH ' +
/* Delete any teachers that may have the target of the student*/
'MATCH (t)<-[tr:TARGET]-(:Teacher) DELETE r ' +
/* Get the assassinated persons target. Set them as X. */
'MATCH (t)-[ar:TARGET]->(x:Student) WHERE ar.confirmed = false AND x.IsDead = false ' +
/* Lets deal with anyone who inherited our target if we are dead :(*/
'OPTIONAL MATCH (t)<-[sr:TARGET]-(ss:Student) WHERE sr.confirmed = false AND ss.IsDead = false ' +
/* Lets steal their kill node and set them as our new target unless of course someone decided to kill us and nab them */
'CREATE (COALESCE(t,a))-[nr:TARGET {killed:false,confirmed:false}]->(t) '

РЕДАКТИРОВАТЬ: Я очистил мой код много. Просто для записи коалесция не может быть использована в отношениях. Вот очищенный код для тех, кто интересуется.

/**
     * a: The student who made the kill
     * v: The victim of the kill
     * r: the relationship between a and t
     * x: the victims target
     * tr (OPTIONAL) : the teacher who we hired to kill our target
     * ss: The person who will be inheriting t(victim)'s target
     */
    /* Get the Killer, set them as A AND set the Victim as T */
    'MATCH (a:Student)-[r:TARGET {uuid:$uuid,confirmed:false}]->(v:Student),' +
    /* Fetch the Victims Target and set them as x */
    '(v)-[:TARGET {confirmed:false}]->(x:Student {IsDead:false}) ' +
    /* Check if we hired a teacher to assassinate our target. Set the relationship to TR (teacher relation)*/
    'OPTIONAL MATCH (v)<-[tr:TARGET]-(:Teacher) ' +
    /* Fetch the alive person who has the target (in-case we died and then it went into review) */
    'MATCH (v)<-[sr:TARGET {confirmed:false}]-(ss:Student {IsDead:false}) ' +
    /* Create a relationship between SS and t */
    'CREATE (ss)-[:TARGET {killed:false,confirmed:false}]->(x) ' +
    /* Set the Kill Relationship to complete and kill the victim */
    'SET r.confirmed = true, v.IsDead = true,a.Balance = a.Balance + 3 ' +
    /* Delete the teacher relationship */
    'DELETE tr ', {uuid:uuid}

1 Ответ

2 голосов
/ 09 февраля 2020

Вы не можете использовать выражение внутри этого CREATE - но вы можете переместить это выражение в оператор WITH, чтобы присвоить его переменной, а затем использовать эту переменную при создании.

Последняя строка может быть заменена на:

/* Lets steal their kill node and set them as our new target unless of course someone decided to kill us and nab them */
WITH COALESCE(t, a) as n, t
CREATE (n)-[nr:TARGET {killed:false,confirmed:false}]->(t)

Что прекрасно скомпилируется, но есть некоторые другие проблемы в запросе, которые мне пришлось сначала исправить:

  • Строка 2, SET r.comfirmed... оканчивается на WITH, но после нее нет переменных
  • Строка 3, MATCH (t)<-... оканчивается на DELETE, но следующая строка начинается с MATCH - вы нужен WITH между двумя

Итак, запрос, который я получаю в итоге:

MATCH (a:Student)-[r:TARGET]->(t:Student) WHERE r.uuid = $uuid
/* Lets Kill the student and set confirmed to true */
SET r.confirmed = true, t.IsDead = true 
/* Delete any teachers that may have the target of the student*/
WITH a, t, r
MATCH (t)<-[tr:TARGET]-(:Teacher) DELETE r
/* Get the assassinated persons target. Set them as X. */
WITH a, t
MATCH (t)-[ar:TARGET]->(x:Student) WHERE ar.confirmed = false AND x.IsDead = false
/* Lets deal with anyone who inherited our target if we are dead :(*/
OPTIONAL MATCH (t)<-[sr:TARGET]-(ss:Student) WHERE sr.confirmed = false AND ss.IsDead = false
/* Lets steal their kill node and set them as our new target unless of course someone decided to kill us and nab them */
WITH COALESCE(t, a) as n, t
CREATE (n)-[nr:TARGET {killed:false,confirmed:false}]->(t)

Но даже тогда это выглядит неправильно - COALESCE всегда разрешит в t, потому что для достижения этого в запросе t должно иметь значение, поэтому последний CREATE просто создаст связь между t и самим собой. Также: OPTIONAL MATCH вводит новую переменную ss, но тогда эта переменная больше нигде не используется (что делает необязательное совпадение несколько избыточным).

Я предполагаю, что COALESCE должно быть между ss и a, а не t и a, но трудно сказать.

...