Мой процесс сопоставления/слияния не создает отношений в базе данных Neo4J

Я новичок в базах данных Neo4j/cypher/graph и пытаюсь следовать Учебное пособие по Neo4j, чтобы импортировать данные, которые у меня есть в csv, и создавать связи.

Следующий код делает то, что я хочу, с точки зрения чтения данных, создания узлов и установки свойств.

/* Importing data on seller-buyer relationshsips */
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///customer_rel_table.tsv' AS row
FIELDTERMINATOR '\t'
MERGE (seller:Seller {sellerID: row.seller})
    ON CREATE SET seller += {name: row.seller_name,
                             root_eid: row.vendor_eid,
                             city: row.city}
MERGE (buyer:Buyer {buyerID: row.buyer})
    ON CREATE SET buyer += {name: row.buyer_name};


/* Creating indices for the properties I might want to match on */
CREATE INDEX seller_id FOR (s:Seller) on (s.seller_name);
CREATE INDEX buyer_id FOR (b:Buyer) on (b.buyer_name);

/* Creating constraints to guarantee buyer-seller pairs are not duplicated */
CREATE CONSTRAINT sellerID ON (s:Seller) ASSERT s.sellerID IS UNIQUE;
CREATE CONSTRAINT buyerID on (b:Buyer) ASSERT b.buyerID IS UNIQUE;

Теперь у меня есть узлы (продавцы и покупатели), которые мне нужны, и я хотел бы связать покупателей и продавцов. Код, который я пробовал для этого:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'file:///customer_rel_table.tsv' AS row
MATCH (s:Seller {sellerID: row.seller})
MATCH (b:Buyer {buyerID: row.buyer})
MERGE (s)-[st:SOLD_TO]->(b)

Запрос выполняется, но я не получаю никаких отношений:

Query executed in 294ms. Query type: WRITE_ONLY. No results.

Поскольку я ничего не прошу RETURN, я думаю, что комментарий «Нет результатов» правильный, но когда я смотрю на метаданные для БД, отношения не появляются. Кроме того, мои данные имеют ~ 220 тыс. строк, поэтому 294 мс кажутся быстрыми.

РЕДАКТИРОВАТЬ: по подсказке @cybersam я попробовал этот запрос: MATCH p=(:Seller)-[:SOLD_TO]->(:Buyer) RETURN p, который дает No results.

Для ясности, в моих данных есть два поля, которые являются сердцевиной отношений: seller и buyer, где продавец продает товар покупателю. Идентификаторы продавца повторяются, но для каждого продавца существуют уникальные пары продавец-покупатель.

Что мне нужно исправить в моем коде, чтобы получить отношения между sellers и buyers? Благодарю вас!


person Savage Henry    schedule 17.06.2020    source источник
comment
Кстати, s.seller_name и b.buyer_name не существует, поэтому индексы будут пустыми. Вместо этого вы должны использовать s.name и b.name. Однако этот вопрос не должен иметь отношения к вашему вопросу.   -  person cybersam    schedule 18.06.2020
comment
Этот запрос что-нибудь возвращает?: MATCH p=(:Seller)-[:SOLD_TO]->(:Buyer) RETURN p   -  person cybersam    schedule 18.06.2020
comment
@cybersam Спасибо за указатель! И нет, к сожалению, это не так. Это приятно отметить; Я отредактирую свой вопрос.   -  person Savage Henry    schedule 18.06.2020
comment
Но в БД есть узлы Buyer и Seller?   -  person cybersam    schedule 18.06.2020
comment
@cybersam Так и есть. MATCH (n:Seller) RETURN (n) LIMIT 25 возвращает мне 25 узлов. То же для покупателя   -  person Savage Henry    schedule 18.06.2020
comment
О, ваш второй запрос не указывает FIELDTERMINATOR '\t'!   -  person cybersam    schedule 18.06.2020
comment
:headdesk: Это сделало это.   -  person Savage Henry    schedule 18.06.2020


Ответы (1)


Предложение LOAD CSV вашего второго запроса не указывает FIELDTERMINATOR '\t'. Ограничителем по умолчанию является запятая (','). Вероятно, поэтому он ничего не MATCH делает.

Попробуйте добавить FIELDTERMINATOR '\t' в конце этого предложения.

person cybersam    schedule 17.06.2020