【问题标题】:Not able to load relationships from CSV无法从 CSV 加载关系
【发布时间】:2019-07-29 12:29:22
【问题描述】:

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

感谢任何帮助。

【问题讨论】:

    标签: neo4j cypher load-csv


    【解决方案1】:

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

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

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

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

    【讨论】:

    • ON CREATE SET 或单独查询需要什么示例?
    • 两者都很好
    • 分享 ON CREATE SET 官方文档的链接:neo4j.com/docs/cypher-manual/current/clauses/merge/…
    • 我知道 ON CREATE SET,但在这种情况下我将如何分离我的查询
    • 好的,单独的查询是这里的可选部分。它是为了数据加载查询的性能。您可以在此博客上查看我们为什么以及如何使用单独的查询:markhneedham.com/blog/2014/10/23/…
    【解决方案2】:

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

    从“file:/IndianCities.csv”加载带有标题的 CSV 作为行 WITH line WHERE line.Latitude IS NOT NULL

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2019-07-11
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多