Streamsets: запрос Neo4j очень медленный - PullRequest
0 голосов
/ 04 января 2019

Я работаю в конвейере Streamsets, чтобы читать данные из каталога активных файлов, куда CSV-файлы выгружаются удаленно, и помещать эти данные в базу данных neo4j. Шаги, которые я использовал, -

  • Создание узла наблюдения для каждой строки в .csv
  • Создание узла CSV и создание связи между CSV и записью
  • Обновление метки времени, полученной от узла csv, до узлов burn_in_test, уже созданной в базе данных графа из другого конвейера, если это последняя
  • создание отношения из CSV для записи в тесте
  • удаление устаревшего отношения на основе последней отметки времени

Теперь я делаю все это, используя jdbc-запрос, а используемый шифровальный запрос -

MERGE (m:OBSERVATION{
  SerialNumber: "${record:value('/SerialNumber')}",
  Test_Stage: "${record:value('/Test_Stage')}",
  CUR: "${record:value('/CUR')}",
  VOLT: "${record:value('/VOLT')}",
  Rel_Lot: "${record:value('/Rel_Lot')}",
  TimestampINT: "${record:value('/TimestampINT')}",     
  Temp: "${record:value('/Temp')}",
  LP: "${record:value('/LP')}",
  MON: "${record:value('/MON')}"
})       
MERGE (t:CSV{
       SerialNumber: "${record:value('/SerialNumber')}",
       Test_Stage: "${record:value('/Test_Stage')}",
       TimestampINT: "${record:value('/TimestampINT')}"
})  
WITH m
MATCH (t:CSV) where t.SerialNumber=m.SerialNumber and t.Test_Stage=m.Test_Stage and t.TimestampINT=m.TimestampINT MERGE (m)-[:PART_OF]->(t)

WITH t, t.TimestampINT AS TimestampINT
MATCH (rl:Burn_In_Test) where rl.SerialNumber=t.SerialNumber and rl.Test_Stage=t.Test_Stage and rl.TimestampINT<TimestampINT
SET rl.TimestampINT=TimestampINT     
WITH t 
MATCH (rl:Burn_In_Test) where rl.SerialNumber=t.SerialNumber and rl.Test_Stage=t.Test_Stage 
MERGE (t)-[:POINTS_TO]->(rl)
WITH rl
MATCH (t:CSV)-[r:POINTS_TO]->(rl) WHERE t.TimestampINT<rl.TimestampINT
DELETE r

Сейчас этот процесс очень медленный и занимает около 15 минут времени для 10 записей. Может ли это быть дополнительно оптимизировано?

1 Ответ

0 голосов
/ 04 января 2019

Рекомендации по использованию MERGE - объединить одно свойство, а затем использовать SET для добавления других свойств.

Если я предполагаю, что серийный номер является свойством, уникальным для каждого узла (может не быть), он будет выглядеть следующим образом:

MERGE (m:OBSERVATION{SerialNumber: "${record:value('/SerialNumber')}"})
SET m.Test_Stage = "${record:value('/Test_Stage')}",
    m.CUR= "${record:value('/CUR')}",
    m.VOLT= "${record:value('/VOLT')}",
    m.Rel_Lot= "${record:value('/Rel_Lot')}",
    m.TimestampINT = "${record:value('/TimestampINT')}",     
    m.Temp= "${record:value('/Temp')}",
    m.LP= "${record:value('/LP')}",
    m.MON= "${record:value('/MON')}"       
MERGE (t:CSV{
       SerialNumber: "${record:value('/SerialNumber')}"       
})
SET t.Test_Stage = "${record:value('/Test_Stage')}",
    t.TimestampINT = "${record:value('/TimestampINT')}"  
WITH m
MATCH (t:CSV) where t.SerialNumber=m.SerialNumber and t.Test_Stage=m.Test_Stage and t.TimestampINT=m.TimestampINT MERGE (m)-[:PART_OF]->(t)

WITH t, t.TimestampINT AS TimestampINT
MATCH (rl:Burn_In_Test) where rl.SerialNumber=t.SerialNumber and rl.Test_Stage=t.Test_Stage and rl.TimestampINT<TimestampINT
SET rl.TimestampINT=TimestampINT     
WITH t 
MATCH (rl:Burn_In_Test) where rl.SerialNumber=t.SerialNumber and rl.Test_Stage=t.Test_Stage 
MERGE (t)-[:POINTS_TO]->(rl)
WITH rl
MATCH (t:CSV)-[r:POINTS_TO]->(rl) WHERE t.TimestampINT<rl.TimestampINT
DELETE r

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

...