Могу ли я установить карту в Neo4j Cypher без перезаписи существующих свойств - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть карта, скажем

car: {make: toyota, color: blue, model: camry} 

, и у меня есть узел Car со свойством

make: toyota

Теперь я хочу добавить свойства автомобиля на карте в мойузел Car.

Однако

MATCH (n:Car {make:'toyota'}) 
SET n +=car 
RETURN n;

перезапишет свойство make на моем узле.

Есть ли способ, которым я могу избежать этого?

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете использовать apoc.map.clean для удаления определенных ключей и значений с карты:

SET c += apoc.map.clean(car, ['make'],[])

0 голосов
/ 20 ноября 2018

Если вы попытаетесь сделать это в одном запросе, вам нужно будет создать одно предложение WHERE, которое перехватит все свойства NULL.Исходя из этого вам нужно будет использовать предложение WITH для передачи этих записей и использовать другое предложение WHERE, чтобы выбрать только те записи, в которых отсутствует одно свойство.Проблема заключается в возвращении к записям из первого предложения WHERE.Это может быть возможно, но если это так, я не знаю, как это сделать с Cypher.

Используя несколько запросов для каждого свойства, это легко сделать, добавив IS NULL к предложению WHERE.

Чтобы продемонстрировать это, создается набор записей с различными комбинациями установленных и отсутствующих свойств.

CREATE (:Car {make: "toyota", color: "red", model: "prius", car_id: 01} )
CREATE (:Car {make: "toyota", color: "red", car_id: 02} )
CREATE (:Car {make: "toyota", model: "prius", car_id: 03} )
CREATE (:Car {make: "toyota", car_id: 04} );

Чтобы увидеть, что было создано

MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

╒════════╤═════════╤═════════╤══════════╤═══════════╕
│"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
╞════════╪═════════╪═════════╪══════════╪═══════════╡
│"toyota"│"prius"  │"red"    │1         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null     │"red"    │2         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"prius"  │null     │3         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null     │null     │4         │["Car"]    │
└────────┴─────────┴─────────┴──────────┴───────────┘

Чтобы обновить только цветсвойство

MATCH (c:Car {make:"toyota"}) 
WHERE c.color IS NULL 
SET c += {color: "blue"}
RETURN c;

и посмотреть, что изменилось

MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

╒════════╤═════════╤═════════╤══════════╤═══════════╕
│"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
╞════════╪═════════╪═════════╪══════════╪═══════════╡
│"toyota"│"prius"  │"red"    │1         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null     │"red"    │2         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"prius"  │"blue"   │3         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│null     │"blue"   │4         │["Car"]    │
└────────┴─────────┴─────────┴──────────┴───────────┘

Обратите внимание, что обновляются только автомобили без свойства цвета.

То же самое для model

MATCH (m:Car {make:"toyota"}) 
WHERE m.model IS NULL
SET m += {model: "camry"} 
RETURN m;

MATCH (n) RETURN n.make,n.model,n.color,n.car_id,LABELS(n);

╒════════╤═════════╤═════════╤══════════╤═══════════╕
│"n.make"│"n.model"│"n.color"│"n.car_id"│"LABELS(n)"│
╞════════╪═════════╪═════════╪══════════╪═══════════╡
│"toyota"│"prius"  │"red"    │1         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"camry"  │"red"    │2         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"prius"  │"blue"   │3         │["Car"]    │
├────────┼─────────┼─────────┼──────────┼───────────┤
│"toyota"│"camry"  │"blue"   │4         │["Car"]    │
└────────┴─────────┴─────────┴──────────┴───────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...