无法从CSV加载关系

时间:2019-07-29 12:29:22

标签: neo4j cypher load-csv

我有一个城市的经度,纬度,州和国家/地区清单,here可用。

我想制作一个像这样的层次结构:

(CITY)-[:HAS_LATITUDE]->(LATITUDE_VALUE)
(CITY)-[:HAS_LONGITUDE]->(LONGITUDE_VALUE)
(CITY)-[:SITUATED_IN]->(STATE)
(STATE)-[:LIES_IN]->(COUNTRY)

这是CSV数据的示例:

Id,City,Latitude,Longitude,State,Country
1,Port Blair,11.67 N,92.76 E,Andaman and Nicobar Islands,India
2,Adilabad,19.68 N,78.53 E,Andhra Pradesh,India
3,Adoni,15.63 N,77.28 E,Andhra Pradesh,India

我试图使用LOAD_CSV子句从CSV加载数据并合并它们,但是我一直在获取:

(no changes, no records)

这是我正在尝试的查询:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'http://botcognitivenlu.eastus.cloudapp.azure.com/CityAssets/IndianCities.csv' AS line
WITH line
WHERE NOT line.Latitude IS NULL AND NOT line.Longitude IS NULL
MATCH (city: CITY { name: trim(line.City), Id: randomUUID(), type: 'CITY' })
MERGE (country: COUNTRY { name: trim(line.Country), Id: randomUUID(), type: 'COUNTRY' })
MERGE (state: STATE { name: trim(line.State), Id: randomUUID(), type: 'STATE' })-[:LIES_IN]->(country)
CREATE (latitude: LOCATION { name: trim(line.Latitude), Id: randomUUID(), type: 'LOCATION' })
CREATE (longitude: LOCATION { name: trim(line.Longitude), Id: randomUUID(), type: 'LOCATION' })
CREATE (city)-[:HAS_LONGITUDE]->(longitude)
CREATE (city)-[:HAS_LATITUDE]->(latitude)
CREATE (city)-[:SITUATED_IN]->(state)
RETURN *

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这里真正的问题是在randomUUID()(和MATCH)子句中使用MERGE

当您尝试匹配CITY节点时,randomUUID()每次都会生成一个新值,该值肯定与ID字段的旧值不匹配。由于将没有匹配的CITY节点具有确切的属性,因此LOAD CSV将忽略跳过创建节点/关系的操作。

从所有的MATCH和MERGE子句中删除randomUUID()。如果要在MERGE子句中为新创建的节点设置ID,请使用ON CREATE SET

不建议在单个查询中加载所有内容,因此,如果可能,请使用单独的查询加载纬度和经度,州和国家/地区。

答案 1 :(得分:0)

`这里是一个解决方案: CREATE CONSTRAINT ON(s:State)ASSERT s.name是UNIQUE; CREATE CONSTRAINT ON(c:Country)ASSERT c.name IS UNIQUE;

从“ file:/IndianCities.csv”中将带有标题的CSV加载为一行 在第WHERE行,纬度不为空

合并(c:Country {name:line.Country}) 合并(s:State {name:line.State}) 合并(ci:City {id:line.Id,名称:line.City,纬度:line.Latitude,经度:line.Longitude})

合并(c)-[:STATE]->(s) 合并(s)-[:CITY]->(ci)`