Резервный метод обхода, когда в узле не найдено значение

#neo4j

#neo4j

Вопрос:

Я совсем новичок в Neo4J, поэтому прошу прощения, если мой вопрос выглядит глупо, но мне интересно, возможно ли выполнить резервное сопоставление, если в моем исходном запросе не найдено значение (null). Вот как выглядит график:

 User1 - linked -> Channel 1 

User1 - linked -> Channel 2

Channel1 - has -> property1_channel_1, null , property3_channel_1

Channel2 - has -> property1_channel_2, property2_channel_2, property3_channel_2
  

В этом примере я ожидаю, что этот ответ будет возвращен при запросе данных User1, Channel1:

property1_channel_1, property2_channel_2, property3_channel_1

Возможно ли это?

Редактировать:

введите описание изображения здесь

Как я могу структурировать свой запрос так, чтобы, если свойство, скажем, количество, в одном из моих продуктов отсутствует, чтобы получить его значение по умолчанию из того же продукта в БАЗЕ. Возможно ли это? В примере брюки в БАЗЕ являются завершенным объектом, но брюки в канале EN являются неполными.

Комментарии:

1. Все ли User s подключены к «БАЗЕ» (которая предположительно является a Channel )? И как определить, какой узел является «БАЗОВЫМ»?

2. Да, все пользователи подключены к БАЗОВОМУ каналу, но у них могут быть и другие каналы. Когда я запрашиваю продукты из канала X, объект данных будет объединен с объектом базового канала (по идентификатору), и будут добавлены только отсутствующие атрибуты. Я знаю, что могу сделать это программно, но я надеялся получить это из коробки от neo4j.

3. Когда вы выполняете запрос, будете ли вы указывать id значение этих 3 вещей: a User , канала и «БАЗЫ» Channel ?

4. мой запрос будет выглядеть следующим образом: match (u: User) -[:HAS_CHANNEL]->(c:Channel) -[:HAS_PRODUCT] ->(p:Product) где u.name =»Младен» возвращает сбор (свойства(p))

5. В вашем вопросе говорится, что вы «запрашиваете данные User1, Channel1», но ваш фактический запрос не указывает конкретный Channel (или BASE канал). Что именно вы пытаетесь сделать, а также как запрос узнает, что Channel использовать в качестве «БАЗЫ»?

Ответ №1:

Я думаю, что-то вроде этого

 // get all the channels the user is linked to
MATCH (u:User)-[:LINK]->(c:Channel) 
WHERE u.name='User1'

// put them in the right order
WITH c ORDER BY c.name

// merge the property maps using apoc.map.mergeList()
RETURN apoc.map.mergeList(COLLECT(properties(c)) AS properties
  

Комментарии:

1. Я думаю, что в моем случае coalesce должен работать лучше, поскольку, согласно документации, это должно возвращать первое «ненулевое» значение на моем графике, но все же мне интересно, как я могу принудительно обратиться к моей БАЗЕ и извлечь оттуда соответствующее значение. P.S: Я приложил диаграммус некоторым объяснением.

2. Хм .. итак, я запустил ваш код, и я возвращаю только один элемент на моей карте { «name»: «…», «id»: 2, «qty»: 10 } Разве это не предполагает, что в нем должно быть 4 разных элемента?

3. Это запрос, который я выполнил: « match (u: User) -[:HAS_CHANNEL]->(c: Channel) -[:HAS_PRODUCT] ->(p:Product) где u.name =»Младен» возвращает apoc.map.mergeList(сбор(свойства(p))) «