Nano Hash - криптовалюты, майнинг, программирование

Cypher LOAD CSV — как создать связанный список узлов, упорядоченных по свойству?

Я новичок в Neo4j и ищу руководство :-)

В основном я хочу создать график ниже из CSV ниже. Связь NEXT создается между точками на основе порядка их свойства sequence. Я хотел бы иметь возможность игнорировать, если sequence являются последовательными. Любые идеи?

(s1:Shape)-[:POINTS]->(p1:Point)

(s1:Форма)-[:ТОЧКИ]->(p2:Точка)

(s1:Форма)-[:ТОЧКИ]->(p3:Точка)

(p1)-[:ДАЛЕЕ]->(p2)

(p2)[:NEXT]->(p3)

и так далее

shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
"1-700-y11-1.1.I","53.42646060879","-6.23930113514121","1","0"
"1-700-y11-1.1.I","53.4268571616632","-6.24059395687542","2","96.6074531286277"
"1-700-y11-1.1.I","53.4269700485041","-6.24093540883784","3","122.549696670773"
"1-700-y11-1.1.I","53.4270439028769","-6.24106779537932","4","134.591291249566"
"1-700-y11-1.1.I","53.4268623569266","-6.24155684094256","5","172.866609667575"
"1-700-y11-1.1.I","53.4268380666968","-6.2417384245122","6","185.235926544428"
"1-700-y11-1.1.I","53.4268874080753","-6.24203735638874","7","205.851454672516"
"1-700-y11-1.1.I","53.427394066848","-6.24287421729846","8","285.060040065768"
"1-700-y11-1.1.I","53.4275257974236","-6.24327509689195","9","315.473852717259"
"1-700-y11-1.2.O","53.277024711771","-6.20739084216546","1","0"
"1-700-y11-1.2.O","53.2777605784999","-6.20671521402849","2","93.4772699644143"
"1-700-y11-1.2.O","53.2780318605927","-6.2068238246152","3","124.525619356934"
"1-700-y11-1.2.O","53.2786209984572","-6.20894363498438","4","280.387737910482"
"1-700-y11-1.2.O","53.2791038678913","-6.21057305710353","5","401.635418300665"
"1-700-y11-1.2.O","53.2790975844245","-6.21075327761739","6","413.677012879457"
"1-700-y11-1.2.O","53.2792296384738","-6.21116766400758","7","444.981964564454"
"1-700-y11-1.2.O","53.2799500357098","-6.21065767664905","8","532.073870043666"
"1-700-y11-1.2.O","53.2800290799386","-6.2105343995296","9","544.115464622458"
"1-700-y11-1.2.O","53.2815594673093","-6.20949562301196","10","727.987702875002"

Это 3-я часть, которую я не могу закончить. Создание СЛЕДУЮЩИХ отношений!

//1. Create Shape
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 
'file:///D:\\shapes.txt' AS csv
With distinct csv.shape_id as ids
Foreach (x in ids | merge (s:Shape {id: x} ));

//2. Create Point, and Shape to Point relationship
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 
'file:///D:\\shapes.txt' AS csv
MATCH (s:Shape {id: csv.shape_id})
with s, csv
MERGE (s)-[:POINTS]->(p:Point {id: csv.shape_id, 
lat : csv.shape_pt_lat, lon : csv.shape_pt_lat, 
sequence : toInt(csv.shape_pt_sequence), dist_travelled : csv.shape_dist_traveled});

//3.Create Point to Point relationship
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 
'file:///D:\\shapes.txt' AS csv
???
03.02.2017

Ответы:


1

Для этого вам потребуется установить процедуры APOC. Он имеет как средства пакетной обработки, так и быстрый способ связать вместе все узлы в коллекции.

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

Мы будем использовать apoc.periodic.iterate() для пакетной обработки. обрабатывать каждую форму и apoc.nodes.link() для связать все упорядоченные точки в форме отношениями.

CALL apoc.periodic.iterate(
  "MATCH (s:Shape) RETURN s",
  "WITH {s} as shape 
   MATCH (shape)-[:POINTS]->(point:Point)
   WITH shape, point
   ORDER by point.sequence ASC
   WITH shape, COLLECT(point) as points
   CALL apoc.nodes.link(points,'NEXT')", 
  {batchSize:1000, parallel:true}) YIELD batches, total
  RETURN batches, total

РЕДАКТИРОВАТЬ

Похоже, может быть ошибка при использовании вызовов процедур в apoc.periodic.iterate(), где не происходят операции изменения (попытка это после включения операции SET во второй части запроса для установки свойства на некоторых узлах, свойство не добавлялся).

Не уверен, является ли это общим случаем вызовов процедур, выполняемых внутри вызовов процедур, или это специфично для apoc.periodic.iterate(), или это происходит только с iterate() и link().

Я зарегистрирую ошибку, если узнаю больше о причине. Тем временем, если вам не нужна пакетная обработка, вы можете отказаться от apoc.periodic.iterate():

   MATCH (shape:Shape)-[:POINTS]->(point:Point)
   WITH shape, point
   ORDER by point.sequence ASC
   WITH shape, COLLECT(point) as points
   CALL apoc.nodes.link(points,'NEXT')
04.02.2017
  • По какой-то причине отношения не создаются. Он правильно возвращает правильное количество пакетов. Я предполагаю, что apoc.perioidic.iterate фиксирует изменения! Может быть, вы не можете вызвать другую процедуру внутри apoc.perioidic.iterate? Я успешно выполнил это, но это не пакетно: MATCH (s:Shape) WITH s MATCH (s)-[:POINTS]->(point:Point) WITH s, point ORDER by point.sequence ASC WITH s, COLLECT(point) как точки CALL apoc.nodes.link(points,'NEXT') return s; 04.02.2017
  • Интересная находка, мне тоже удалось повторить. Изменил мой ответ, чтобы отметить ошибку и предложить упрощенный запрос без пакетной обработки, которая сработала для вас. 05.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..