我使用Neo4j 2.2.0并通过LOAD CSV导入数据(以节点文件和关系文件的形式)。
节点将全部导入" Person"标签,但我想添加" Geotag"如果节点文件中的纬度和经度字段为空,则标记其中一些。
因此,例如,下面的节点文件(忽略行之间的额外行)
"用户名"" ID""纬度""经度"
" ABC123"" 111111111"" 33.223"" 33.223"
" abc456"" 222222222"""""
我想创建节点" abc123"使用Person和Geotag标签,节点abc456只包含Person标签,因为它没有纬度和经度。
我认为这将是:
LOAD CSV WITH HEADERS FROM "file:/users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, latitude: line.latitude, longitude: line.longitude })
SET p: (CASE WHEN line.latitude IS NOT NULL THEN GEOTAGGED);
我知道我正在使用CASE语句以及SET语句,但这是否可以在导入节点时执行?该文件中有超过300万个节点,在插入时执行此操作会很有帮助,这样当添加新节点时(通常是批量添加),我们不会仅仅为了获取新节点而探索所有节点。 / p>
我已经探讨了其他SO问题(How to set relationship type and label in LOAD CSV?,Loading relationships from CSV data into neo4j db,Neo4j Cypher - creating nodes and setting labels with LOAD CSV),但是我们的问题与那些OP试图使用的问题不同文件中的一个字段作为标签,我只是试图根据文件中的数据做出条件决定使用哪些标签。
谢谢!
修改 在回答答案时,我正在尝试以下方法:
LOAD CSV WITH HEADERS FROM "file:/users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, latitude: line.latitude, longitude: line.longitude })
CASE WHEN line.latitude IS NOT NULL THEN [1] ELSE [] END AS geotagged
FOREACH (x IN geotagged | SET p:Geotag);
我收到以下错误:
QueryExecutionKernelException: Invalid input 'A': expected 'r/R' (line 3, column 2 (offset: 454)) "CASE WHEN line.latitude IS NOT NULL THEN [1] ELSE [] END AS geotagged"
将胡萝卜放在' A' in" CASE"
EDIT2:
以下是完整的解决方案,受到大卫解决方案的启发,但略有不同。
LOAD CSV WITH HEADERS FROM "file:/users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, latitude: line.latitude, longitude: line.longitude })
WITH p, CASE WHEN line.latitude <> "" THEN [1] ELSE [] END AS geotagged
FOREACH (x IN geotagged | SET p:Geotag);
答案 0 :(得分:1)
...
case when line.latitude IS NOT NULL then [1] else [] end as geotagged
foreach(x in geotagged | set p:Geotag)
...