подключить несколько узлов к одному узлу - PullRequest
0 голосов
/ 08 февраля 2020

Я действительно новичок в Neo4J. У меня есть файл .csv с этими столбцами:

address,ip
add1.domain.com,1.1.1.1
add2.domain.org,2.2.2.2
add3.domain.org,3.3.3.3

Я хочу, чтобы каждая строка была узлом. Все эти узлы должны быть подключены к одному узлу (который представляет узел домена). Я написал этот код:

LOAD CSV FROM 'file:///file.csv' AS row
WITH row[0] AS sub, row[1] AS ip
MERGE (p:sub {sub: sub})
  SET p.ip = ip
CREATE (d:domain{name: "domain.com"})
CREATE (p)-[r:related_to]->(d)
RETURN count(p)

Затем я использовал этот запрос для отображения узлов:

MATCH (p:sub)-[rel:CONTAINS]->(d:domain)
RETURN p, rel, r

, но я обнаружил, что каждая строка файла (каждый узел) отдельно подключен к доменному узлу 2 раза. Посмотрите на это:

neo

Что не так и как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Прежде всего, вы должны либо избавиться от строки заголовка в вашем CSV-файле, либо использовать имена заголовков в своем запросе. См. мой ответ на ваш другой вопрос .

Ваша основная проблема заключалась в использовании CREATE для создания узла domain и отношения related_to. Из-за использования CREATE каждая строка файла данных создаст новый узел и взаимосвязь. И то же самое происходит каждый раз, когда вы повторяете один и тот же запрос. (Возможно, вы выполнили запрос дважды, что привело бы к полученным результатам.)

Вы должны начать с нуля и попробовать использовать этот запрос:

LOAD CSV WITH HEADERS FROM 'file:///file.csv' AS row
MERGE (p:sub {sub: row.address})
SET p.ip = row.ip
MERGE (d:domain{name: "domain.com"})
MERGE (p)-[r:related_to]->(d)
RETURN count(p)
0 голосов
/ 11 февраля 2020

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

CREATE INDEX ON :Domain(name);
CREATE INDEX ON :Sub(sub);
MERGE (:Domain {name: "domain.com"})

В вашей модели вы используете related_to и содержит, но я предполагаю путь (:Sub)-[:RELATED_TO]->(:Domain) здесь.

В зависимости от того, сколько строк у вас есть, Возможно, вы захотите использовать periodi c commitits.

USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM 'file:///files.csv' as row
MERGE (p:Sub {sub: row.address, ip: row.ip})
MATCH (d:Domain {name: "domain.com"})
MERGE (p)-[:RELATED_TO]->(d)

Чтобы проверить, что все работает, просто запустите MATCH path=(:Domain {name: "domain.com"})--() RETURN path, чтобы увидеть все, что напрямую связано с узлом домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...