#neo4j #nosql #cypher
Вопрос:
Я загружаю простые csv-данные в neo4j. Данные просты следующим образом :-
uniqueId compound value category
ACT12_M_609 mesulfen 21 carbon
ACT12_M_609 MNAF 23 carbon
ACT12_M_609 nifluridide 20 suphate
ACT12_M_609 sulfur 23 carbon
Я загружаю данные с URL-адреса, используя следующий запрос —
LOAD CSV WITH HEADERS
FROM "url"
AS row
MERGE( t: Transaction { transactionId: row.uniqueId })
MERGE(c:Compound {name: row.compound})
MERGE (t)-[r:CONTAINS]->(c)
ON CREATE SET c.category= row.category
ON CREATE SET r.price =row.value
Затем я выполняю агрегацию, чтобы подсчитать общее количество заказов для соединения и создать свойство для узла следующим образом —
MATCH (c:Compound) <-[:CONTAINS]- (t:Transaction)
with c.name as name, count( distinct t.transactionId) as ord
set c.orders = ord
Пока все хорошо. Я могу добиться того, чего хочу, но у меня есть следующие 2 вопроса —
- Как я могу создать
orders
свойство дляcompound
узла на самом первом шаге? .т. е. когда я загружаю данные, я хотел бы сразу выполнить агрегацию. - Для составного узла я также устанавливаю свойство для категории. Теоретически, его также можно смоделировать,
category -contains-> compound
создавCategory
узел. Но какое преимущество я получу, если сделаю это? Потому что я могу выполнять запросы и получать ожидаемый результат без создания этого дополнительного узла.
Спасибо вам за ваш ответ.
Ответ №1:
- Я не думаю, что это возможно, ЗАГРУЗКА CSV проходит по одной строке за раз, поэтому в строке 1 неизвестно, сколько еще строк последует.
Я думаю, вы могли бы создать виртуальные узлы и отношения, объединить их, а затем использовать их для создания реальных узлов, но это было бы намного сложнее. Виртуальные узлы/Rels - Это зависит от того, на вопросы/запросы, которые вы хотите задать.
График базе оптимизирован для следующих отношений, поэтому, если вы часто делаете запрос, где категория-это критерии (напримерMATCH (c: Category {category_id: 12})-[r]-(:Compound)
), это может быть более производительным, чтобы создать ярлык для него.
Если вы просто хотите, чтобы получить категорию в результатах (напримерRETURN compound.category
), то это нормально, как собственность.