Установить связь между столбцами буксировки, если в одном столбце есть повторяющиеся данные - PullRequest
0 голосов
/ 27 февраля 2019

Приведенный ниже набор данных был импортирован в Neo4j.Мне нужно установить отношение, указывающее, что Table_ID содержит данные в Column_ID.

Table_ID    Table       Column_ID   Column
8       Product     1753        Key
8       Product     1754        Lock
8       Product     1755        Switch
8       Product     1756        Bolt
9       Catalogue   1761        Key
9       Catalogue   1762        Wrench
9       Catalogue   1763        Spanner
9       Catalogue   1764        Screw
9       Catalogue   1765        Bolt

Чтобы создать отношение, указывающее, что Table_Id содержит Column_id.

CREATE CONSTRAINT ON (c:Column_ID) ASSERT c.id IS UNIQUE;

CREATE CONSTRAINT ON (t:Table_ID) ASSERT t.id IS UNIQUE;

LOAD CSV WITH HEADERS FROM "file:///Tableid_ColumnID.csv" AS line

MATCH (c:Column {id: toInteger (line.Column_ID)}) 

MATCH (t:Table {id: toInteger (line.Table_ID)})

MERGE (t)-[:CONTAINS]->(c)

Запрос возвращен с (без изменений, без записей).Может ли кто-нибудь помочь с этим запросом, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019
  1. По умолчанию LOAD CSV использует запятую в качестве разделителя данных.Ваш файл данных использует одну или 2 вкладки в качестве разделителя.Итак, вместо этого используйте эти данные:

    Table_ID,Table,Column_ID,Column
    8,Product,1753,Key
    8,Product,1754,Lock
    8,Product,1755,Switch
    8,Product,1756,Bolt
    9,Catalogue,1761,Key
    9,Catalogue,1762,Wrench
    9,Catalogue,1763,Spanner
    9,Catalogue,1764,Screw
    9,Catalogue,1765,Bolt
    
  2. Вы не показали, как вы создали начальные узлы, поэтому вот пример того, как это сделать (обратите внимание, что метки узловColumn и Table, НЕ Column_ID и Table_ID), использующие ваш CSV-файл:

    LOAD CSV WITH HEADERS FROM "file:///Tableid_ColumnID.csv" AS line
    MERGE (c:Column {id: TOINTEGER(line.Column_ID)})
    ON CREATE SET c.name = line.Column
    MERGE (t:Table {id: TOINTEGER(line.Table_ID)})
    ON CREATE SET t.name = line.Table
    
  3. Учитывая приведенные выше метки узла, ваши ограничения не были созданы правильно, поскольку у вас нет узлов с метками Column_ID и Table_ID.Вот исправленные операторы:

    CREATE CONSTRAINT ON (c:Column) ASSERT c.id IS UNIQUE;
    
    CREATE CONSTRAINT ON (t:Table) ASSERT t.id IS UNIQUE;
    
  4. С учетом вышеуказанных исправлений ваш запрос (повторяется ниже) теперь будет работать, как и ожидалось:

    LOAD CSV WITH HEADERS FROM "file:///Tableid_ColumnID.csv" AS line
    MATCH (c:Column {id: TOINTEGER(line.Column_ID)}) 
    MATCH (t:Table {id: TOINTEGER(line.Table_ID)})
    MERGE (t)-[:CONTAINS]->(c)
    
0 голосов
/ 28 февраля 2019

Это будет означать, что одно из совпадений было неудачным (поэтому либо узлы: Column и: Table не были импортированы должным образом или вообще не были до этого, либо написание и / или регистр меток и свойств не выполняетсясоответствует тому, что было фактически импортировано), или что связь, которую вы пытаетесь MERGE, уже существует между всеми совпадающими узлами.

Возможно, вы захотите запустить PROFILE запроса (что должно быть безопасно, так какв результате ничего на графике не было изменено), и убедитесь, что совпадения привели к появлению строк и что в точке, где произошло слияние, было ненулевое количество строк, или проверьте на наличие ограниченного числа строк изCSV, в котором совпадения с c и t действительно выполняются (строка LIMIT, сохраните совпадения и верните их, избегая слияния).

Это должно сказать вам, если проблема в совпадениях,или если слияние просто соответствует существующим отношениям (то есть этот импорт уже выполненизд.)

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