2015-04-02 24 views
2

我正在使用Neo4j 2.2.0并通过LOAD CSV导入数据(以节点文件和关系文件的形式)。基于LOAD CSV中的数据设置标签

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

因此,举例来说,下面的节点文件(忽略行之间的额外线)

"username","id","latitude","longitude"

"abc123","111111111","33.223","33.223"

"abc456","222222222","",""

我想创建节点“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万个节点,插入时会有帮助,所以当新节点被添加(通常是分批)时,我们并没有探索所有的节点,只是为了找到新的节点。

我已经探索其他等问题(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根据文件中的数据决定使用哪些标签。

谢谢!

编辑: 针对一个答案,我想以下几点:

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:

下面是一个完整的解决方案,它的灵感来源于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

你就近了。您不能将条件逻辑放入设置的标签语句中。当你有一个非零的lon/lat值时,你需要创建一个1的集合来迭代。然后遍历1的集合并在那里执行语句。

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

Bennet,谢谢。也许我是误解,我仍然收到错误,我将它添加到我原来的帖子中。 – Brooks 2015-04-02 18:59:40

+0

对不起......我还假设,当你写下“CASE WHEN时的情况”时,这是一个错字,但我尝试了两种方法,但仍然没有运气。 – Brooks 2015-04-02 19:15:46

+0

为了清楚起见,上面的语法是不起作用的,但是让我走上了正确的轨道。要纠正它,只需在“CASE WHEN”前面加上“WITH p”即可。 OP中的完整解决方案。 – Brooks 2015-04-02 20:00:41