我有一个城市的经度,纬度,州和国家/地区清单,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 *
感谢您的帮助。
答案 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)`