Как мне подключиться 3 узла - PullRequest
0 голосов
/ 04 января 2019

Я новичок в использовании Neo4j, может кто-нибудь объяснить, как я могу это сделать. У меня есть CSV-файл, который содержит 3 столбца, который выглядит так

offences|  places | recorded
rape    |  nicosia| 1
robbery |  nicosia| 3
rape    |  limasol| 4
robbery |  limasol| 5

Что я хочу, так это способ связать преступление с местом, и записанный номер - вот что я придумал.

LOAD CSV FROM 'file:///crime2.csv' AS Line 
MERGE (district:DISTRICT { Name: Line[1]})
CREATE (crime:CRIME { Name: Line[0]})
CREATE (number:Number{ Name:toInteger(Line[2])})
CREATE (number)-[:Amount]->(crime)-[:From]->(district)
WITH district, crime, number
MATCH (a:CRIME)-[:`From`]->(b:DISTRICT) RETURN a,b; 

мой код не справился с заданием полностью, вместо этого он отображается так мой код отображает только места и обиды

Мне нужен способ показать место -> преступления -> записанный номер. спасибо

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете добавить еще одно условие соответствия узла в свой запрос

MATCH (n:Number)-[:Amount]->(a:CRIME)-[:From]->(b:DISTRICT) RETURN a,b,n; 

Если вы используете это в любом реальном случае / проекте, вам нужно подумать о модели данных, которую вы используете(как предложено @Tomaz).

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

Я пробовал выше запрос на моем ноутбуке, и он дает мне ожидаемый результат.

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

Вы использовали предложение create, которое снова создает узлы Crime и Number каждый раз, когда вы выполняете этот запрос.

Удалить существующие данные:

MATCH (n:Number),(a:CRIME),(b:DISTRICT) DETACH DELETE  a,b,n;

Загрузить данные

LOAD CSV FROM {path} AS Line  
MERGE (district:DISTRICT { Name: Line[1]}) 
CREATE (crime:CRIME { Name: Line[0]}) 
CREATE (number:Number{Name:toInteger(Line[2])}) 
CREATE(number)-[:Amount]->(crime)-[:From]->(district);

Получить результат:

MATCH (n:Number)-[:Amount]->(a:CRIME)-[:From]->(b:DISTRICT) RETURN a,b,n;

enter image description here

0 голосов
/ 04 января 2019

Вы можете просто добавить номер к запросу MATCH

LOAD CSV FROM 'file:///crime2.csv' AS Line 
MERGE (district:DISTRICT { Name: Line[1]})
CREATE (crime:CRIME { Name: Line[0]})
CREATE (number:Number{ Name:toInteger(Line[2])})
CREATE (number)-[:Amount]->(crime)-[:From]->(district)
WITH district, crime, number
MATCH p = (:Number)-[:AMOUNT]->(:CRIME)-[:`From`]->(:DISTRICT) RETURN p;

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

Еще одна вещь, которую нужно добавить, вы, вероятно, хотите изменить

CREATE (crime:CRIME { Name: Line[0]})

до

MERGE (crime:CRIME { Name: Line[0]})

так что для конкретного преступления есть один узел, так как это графическая база данных, и вы хотите, чтобы ваши данные были подключены IMO.

...