0

我有一个城市列表,它们的纬度和经度,他们的州和国家可用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 *

任何帮助表示赞赏。

4

2 回答 2

2

使用randomUUID()in MATCH(and MERGE) 子句是这里的真正问题。

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

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

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

于 2019-07-29T13:13:37.730 回答
0

`这是一个解决方案:在 (s:State) 上创建约束断言 s.name 是唯一的;在 (c:Country) 上创建约束断言 c.name 是唯一的;

LOAD CSV WITH HEADERS FROM "file:/IndianCities.csv" As line WITH line WHERE line.Latitude IS NOT NULL

MERGE (c:Country {name: line.Country}) MERGE (s:State {name: line.State}) MERGE (ci:City {id: line.Id, name: line.City, latitude: line.Latitude,经度:line.Longitude})

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

于 2019-07-30T21:52:38.697 回答