首页 文章

根据LOAD CSV中的数据设置标签

提问于
浏览
3

我正在使用Neo4j 2.2.0并通过LOAD CSV导入数据(以节点文件和关系文件的形式) .

所有节点都将在“Person”标签下导入,但是如果节点文件中的纬度和经度字段为空,我想为其中一些节点添加“Geotag”标签 .

所以,例如,下面的节点文件(忽略行之间的额外行)

“username”,“id”,“latitude”,“longitude”“abc123”,“111111111”,“33.223”,“33.223”“abc456”,“222222222”,“”,“”

我想创建带有Person和Geotag标签的节点“abc123”和带有Person标签的节点abc456,因为它没有纬度和经度 .

我认为这将是:

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万个节点,在插入时这样做是有帮助的,这样当添加新节点时(通常是批量添加),我们不会仅仅为了获得新节点而探索所有节点 .

我已经探讨了其他SO问题(How to set relationship type and label in LOAD CSV?Loading relationships from CSV data into neo4j dbNeo4j Cypher - creating nodes and setting labels with LOAD CSV),但它们与我的问题有所不同,因为那些OP正在尝试使用文件中的字段作为标签而我只是试图对哪些标签做出有条件的决定基于文件中的数据使用 .

谢谢!

EDIT: 在回答答案时,我正在尝试以下方法:

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"

将胡萝卜放在“CASE”中的“A”下

EDIT2:

以下是完整的解决方案,受到David的解决方案的启发,并且略有不同 .

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);

1 回答

  • 1

    你很亲密您不能将条件逻辑放在set label语句中 . 当你有一个非空的lon / lat值时,你需要创建一个1的集合来迭代 . 然后遍历1的集合并在那里执行语句 .

    ...
    case when line.latitude IS NOT NULL then [1] else [] end as geotagged
    foreach(x in geotagged | set p:Geotag)
    ...
    

相关问题