2015-05-13 4 views
1

Возможно ли установить свойство на узле и УДАЛИТЬ его в одном запросе cypher, не вызывая фактическую запись диска в Neo4j.Добавить временное свойство на узле Cypher

Например, я попытался дублировать n-й узел в этом запросе, используя n в качестве errand, но SET на errand приводит к SET на n и равно REMOVE, таким образом свойство теряется в возвращаемом значении.

Это своего рода попытка создать переходное свойство на узле.

String q = "MATCH (owner)-[:POSTED]->n WITH owner, n, n as errand, 
     CASE WHEN owner-[:RECOMMENDED]->n THEN 'BROADCASTED' 
     WHEN owner-[:POSTED]->n THEN 'POSTED' 
     WHEN owner-[:GOT_NOMINATED]->n THEN 'NOMINATED' 
     ELSE 'CONNECTED' 
     END AS relationship 
SET errand.meta = relationship 
REMOVE n.meta 
RETURN errand LIMIT 1"; 

Однако, когда я когда-либо проверить мой объект домена, чтобы увидеть, если свойство было установлено Neo4j, она возвращает нуль.

public class Errand { 
    private String meta; 

    Boolean isMetaSet() { 
      return meta != null; 
    } 
} 

Использование SDN Neo4j Я получаю свой объект запроса как.

Errand single = template.query(q, null).to(Errand.class).singleOrNull(); 

System.out.println (single.isMetaSet()); 

возвращает false.

Является ли ответ в Neo4J create temp variable within Cypher применимым для узлов?

В настоящее время я использую Neo4j во встроенном режиме с Neo4j, а мои запросы выполняются с использованием класса Neo4jTemplate.

Смотрите ответ на подобный вопрос, я спросил по этому вопросу на Set a transient property on a node neo4j

+0

Я хотел бы вернуть единый узел, десериализуемый в объект модели –

+0

Отличный ответ при попытке вернуть свойство. –

+0

Это вызывает исключение нулевого указателя, поскольку оно удаляется до его возврата. Что-то не так с моим запросом cypher? –

ответ

0

Ваш запрос не нужно свойство временного узла или специальную переменную вообще. (Кроме того, как сказал @FrobberOfBits, ваш подход был испорчен.)

Следующий запрос устраняет errand (который был всего лишь псевдоним для n узла), а также устанавливает n.meta свойство:

MATCH (owner)-[:POSTED]->n 
SET n.meta = 
     CASE WHEN owner-[:RECOMMENDED]->n THEN 'BROADCASTED' 
     WHEN owner-[:POSTED]->n THEN 'POSTED' 
     WHEN owner-[:GOT_NOMINATED]->n THEN 'NOMINATED' 
     ELSE 'CONNECTED' 
     END 
RETURN n.meta LIMIT 1 

(Поскольку вы ограничиваете 1, нет необходимости использовать DISTINCT.)

+0

Ответ, кажется, отклоняется от вопроса. Не могли бы вы посмотреть, как мы можем установить временное свойство в NODE в Neo4j? –

+0

Это сильно отличается от создания произвольной переменной в Neo4j, на которую отвечает @FrobberOfBits. Http://stackoverflow.com/questions/28375229 –

+0

Тема вопроса - это временные свойства узла, а не переменные - это совершенно разные вещи.Также первая ссылка вопроса указывает на вопрос, принятый ответ которого связан с свойствами узла. Наконец, запрос, заданный в вопросе, на самом деле не требовал ничего, чтобы вернуть одно значение 'relationship', поэтому я предоставил более прямой запрос. Вы говорите, что весь ваш вопрос на самом деле спрашивал, как установить свойство 'meta'? – cybersam

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