Свойства узла не отображаются правильно - PullRequest
0 голосов
/ 24 марта 2020

У меня есть файл .csv с тремя столбцами, разделенными ",". Первый столбец содержит имена, 2-й столбец содержит фамилии, а 3-й столбец содержит значения:

Lname,Fname,Num
Brown,Helen,3
Right,Eliza,1
Green,Helen,3
Pink,Kate,2
Yellow,Helen,3

и другой файл .csv, подобный этому:

central,value
cent1,10

Я хочу создать узлы для столбца Lname и узлы для столбца Fname. Для строк, имеющих одинаковое Fname, я хочу подключить Lname к соответствующему Fname. Например, я хочу иметь узел "Helen", к которому три узла "Brown", "Green" и "Yellow" подключены к "Helen" (также, если Fname идентичен, Num также идентичен), я также хочу подключить "Fname" узлы к «центральному узлу». Это мой желаемый вывод:

enter image description here

Я использую этот код:

LOAD CSV WITH HEADERS FROM 'file:///central.csv' AS frow
MERGE (c:center {name: frow.central})
WITH *
LOAD CSV WITH HEADERS FROM 'file:///names.csv' AS srow
WITH srow.Fname AS first, srow.Lname AS last, srow.Num as num
MERGE (p:la {last: last})
MERGE (o:fi {first: first, num: num})
MERGE (c)-[r:CONTAINS {first:first}]->(o)
MERGE (o)-[rel:CONTAINS {first: first}]->(p)
RETURN count(o)

Когда я нажимаю на каждый first узел в Neo4j я ожидаю увидеть first и num в качестве его свойств из-за этой строки:

MERGE (o:fi {first: first, num: num})

, но используя этот код, только один из first узлов содержит num как его свойства. Другие узлы first не показывают num в качестве своих свойств. Что не так?

1 Ответ

2 голосов
/ 27 марта 2020
  1. Ваш файл names.csv содержит ошибку. Helen отображается с 2 различными значениями Num: 2 и 3. Вот почему ваш запрос создал 2 различных узла Helen. Файл должен выглядеть следующим образом:

    Lname,Fname,Num
    Brown,Helen,3
    Right,Eliza,1
    Green,Helen,3
    Pink,Kate,2
    Yellow,Helen,3
    
  2. Во втором предложении WITH не указано c, поэтому c стала несвязанной переменной. Это заставило предложение MERGE (c)-[:CONTAINS]->(o) создать новый узел c вместо повторного использования исходного узла c.

    Это фиксированная версия вашего запроса:

    LOAD CSV WITH HEADERS FROM 'file:///central.csv' AS frow
    MERGE (c:center {name: frow.central})
    WITH c
    LOAD CSV WITH HEADERS FROM 'file:///names.csv' AS srow
    WITH c, srow.Fname AS first, srow.Lname AS last, srow.Num as num
    MERGE (p:la {last: last})
    MERGE (o:fi {first: first, num: num})
    MERGE (c)-[:CONTAINS]->(o)
    MERGE (o)-[:CONTAINS]->(p)
    RETURN count(o)
    

    Примечание: я также удалил настройки свойства {first:first} из отношений CONTAINS, так как не рекомендуется хранить избыточную информацию в БД. В любом случае один из конечных узлов этих отношений всегда будет иметь имя. На самом деле, было бы также лучше использовать разные типы отношений (например, CONTAINS и HAS_LAST_NAME).

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