根据 LOAD CSV 中的数据设置标签
SET label based on data within LOAD CSV
我正在使用 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?, , 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"
在"CASE"
'A'下加上胡萝卜
编辑2:
下面是完整的解决方案,灵感来自 David 的解决方案,但与 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);
你很接近。您不能将条件逻辑放在设置标签语句中。当你有一个非空 lon/lat 值时,你需要创建一个 1 的集合来迭代。然后遍历1的集合,执行那里的语句。
...
case when line.latitude IS NOT NULL then [1] else [] end as geotagged
foreach(x in geotagged | set p:Geotag)
...
我正在使用 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?,
谢谢!
编辑: 作为对答案的回应,我正在尝试以下操作:
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'下加上胡萝卜编辑2:
下面是完整的解决方案,灵感来自 David 的解决方案,但与 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);
你很接近。您不能将条件逻辑放在设置标签语句中。当你有一个非空 lon/lat 值时,你需要创建一个 1 的集合来迭代。然后遍历1的集合,执行那里的语句。
...
case when line.latitude IS NOT NULL then [1] else [] end as geotagged
foreach(x in geotagged | set p:Geotag)
...