#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 подключены к «БАЗЕ» (которая предположительно является aChannel
)? И как определить, какой узел является «БАЗОВЫМ»?2. Да, все пользователи подключены к БАЗОВОМУ каналу, но у них могут быть и другие каналы. Когда я запрашиваю продукты из канала X, объект данных будет объединен с объектом базового канала (по идентификатору), и будут добавлены только отсутствующие атрибуты. Я знаю, что могу сделать это программно, но я надеялся получить это из коробки от neo4j.
3. Когда вы выполняете запрос, будете ли вы указывать
id
значение этих 3 вещей: aUser
, канала и «БАЗЫ»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))) «