Правильный порядок операций в neo4j — ЗАГРУЗКА, СЛИЯНИЕ, СОПОСТАВЛЕНИЕ, С, НАБОР

#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 вопроса —

  1. Как я могу создать orders свойство для compound узла на самом первом шаге? .т. е. когда я загружаю данные, я хотел бы сразу выполнить агрегацию.
  2. Для составного узла я также устанавливаю свойство для категории. Теоретически, его также можно смоделировать, category -contains-> compound создав Category узел. Но какое преимущество я получу, если сделаю это? Потому что я могу выполнять запросы и получать ожидаемый результат без создания этого дополнительного узла.

Спасибо вам за ваш ответ.

Ответ №1:

  1. Я не думаю, что это возможно, ЗАГРУЗКА CSV проходит по одной строке за раз, поэтому в строке 1 неизвестно, сколько еще строк последует.
    Я думаю, вы могли бы создать виртуальные узлы и отношения, объединить их, а затем использовать их для создания реальных узлов, но это было бы намного сложнее. Виртуальные узлы/Rels
  2. Это зависит от того, на вопросы/запросы, которые вы хотите задать.
    График базе оптимизирован для следующих отношений, поэтому, если вы часто делаете запрос, где категория-это критерии (например MATCH (c: Category {category_id: 12})-[r]-(:Compound) ), это может быть более производительным, чтобы создать ярлык для него.
    Если вы просто хотите, чтобы получить категорию в результатах (например RETURN compound.category ), то это нормально, как собственность.