Neo4j 将/CASE子句链接在一起

Neo4j 将/CASE子句链接在一起,neo4j,cypher,Neo4j,Cypher,我正在尝试为节点设置标签,以便在通过LOAD CSV语句创建节点时对其进行适当的描述(请参阅我在此过程中遇到的一个问题:)。我已经能够在创建阶段设置一个标签,但是现在我想应用多个标签中的一个,每个标签都有自己的一组条件,并且每个都是互斥的 因此,如果我的CSV文件中包含以下内容: "username","id","latitude","longitude","placeLatitude","placeLongitude" "abc123","111111111","33.223","33.223

我正在尝试为节点设置标签,以便在通过LOAD CSV语句创建节点时对其进行适当的描述(请参阅我在此过程中遇到的一个问题:)。我已经能够在创建阶段设置一个标签,但是现在我想应用多个标签中的一个,每个标签都有自己的一组条件,并且每个都是互斥的

因此,如果我的CSV文件中包含以下内容:

"username","id","latitude","longitude","placeLatitude","placeLongitude"
"abc123","111111111","33.223","33.223"
"abc456","222222222","","","33.223","33.223"
我希望用户abc123被标记为“geo”,用户abc456被标记为“placegeo”。这似乎是Neo4j/Cypher应该能够很容易做到的事情,但似乎存在限制,因为我希望所有决策都在一个声明中完成

我一直在尝试以下代码:

LOAD CSV WITH HEADERS FROM "file:d:/Users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, statusLat: line.statusLat, statusLon: line.statusLon, placeLat: line.placeLat, placeLon: line.placeLon })
WITH p, CASE WHEN (line.statusLat <> "" AND line.statusLat <> "0.0") THEN [1] ELSE [] END AS geotagged
FOREACH (a IN geotagged | SET p:Geo)
WITH p, CASE WHEN (COUNT(LABELS(p)) = 1 AND line.placeLat <> "" AND line.placeLat <> "0.0") THEN [1] ELSE [] END as place
FOREACH (b IN place | SET p:placegeo);
将“文件:d:/Users.CSV”中的标题作为行加载CSV
创建(p:Person{username:line.username,id:line.id,statusLat:line.statusLat,statusLon:line.statusLon,placeLat:line.placeLat,placeLon:line.placeLon})
对于p,当(line.statusLat“”和line.statusLat“0.0”)时,则[1]ELSE[]以地理标记结束
FOREACH(地理标记中的a |集p:Geo)
对于p,当(计数(标签(p))=1且line.placeLat“”和line.placeLat“0.0”)为1时,则[1]否则[]以位置结束
FOREACH(b就地|集p:placegeo);
我也尝试过:

LOAD CSV WITH HEADERS FROM "file:d:/Users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, statusLat: line.statusLat, statusLon: line.statusLon, placeLat: line.placeLat, placeLon: line.placeLon })
WITH p, CASE WHEN (line.statusLat <> "" AND line.statusLat <> "0.0") THEN [1] ELSE [] END AS geotagged
FOREACH (a IN geotagged | SET p:Geo)
WITH p, COUNT(LABELS(p)) AS lb WHERE lb = 1,
CASE WHEN (line.placeLat <> "" AND line.placeLat <> "0.0") THEN [1] ELSE [] END as place
FOREACH (b IN place | SET p:placegeo);
将“文件:d:/Users.CSV”中的标题作为行加载CSV
创建(p:Person{username:line.username,id:line.id,statusLat:line.statusLat,statusLon:line.statusLon,placeLat:line.placeLat,placeLon:line.placeLon})
对于p,当(line.statusLat“”和line.statusLat“0.0”)时,则[1]ELSE[]以地理标记结束
FOREACH(地理标记中的a |集p:Geo)
对于p,将(标签(p))计数为lb,其中lb=1,
当(line.placeLat“”和line.placeLat“0.0”)时,则[1]ELSE[]结束为place
FOREACH(b就地|集p:placegeo);
(在其他变体中)似乎我无法将/CASE语句链接在一起

基本上,我想要评估第一组条件,如果它满足它,添加标签,停止并移动到CSV文件中的下一行。否则,继续下一组条件并重复。如果我可以在集合中发出“停止”或“退出”命令,那就好了

我不能嵌套FOREACH,因为它是相互排他性的(即,如果它是一个标签,那么它就不是另一个)


还有什么办法吗?

你已经很接近了。这应该适合您:

LOAD CSV WITH HEADERS FROM "file:d:/Users.csv" AS line
CREATE (p:Person { username: line.username, id: line.id, statusLat: line.statusLat, statusLon: line.statusLon, placeLat: line.placeLat, placeLon: line.placeLon })
WITH p,
    CASE WHEN (line.statusLat <> "" AND line.statusLat <> "0.0") THEN [1] ELSE [] END AS geotagged,
    CASE WHEN ((line.statusLat = "" OR line.statusLat = "0.0") AND line.placeLat <> "" AND line.placeLat <> "0.0") THEN [1] ELSE [] END as place
FOREACH (a IN geotagged | SET p:Geo)
FOREACH (b IN place | SET p:placegeo);
将“文件:d:/Users.CSV”中的标题作为行加载CSV
创建(p:Person{username:line.username,id:line.id,statusLat:line.statusLat,statusLon:line.statusLon,placeLat:line.placeLat,placeLon:line.placeLon})
有了p,
当(line.statusLat“”和line.statusLat“0.0”)然后[1]ELSE[]以地理标记结束时,
当((line.statusLat=”“或line.statusLat=“0.0”)和line.placeLat“”以及line.placeLat“0.0”)时,[1]否则[]结束为位置
FOREACH(地理标记中的a |集p:Geo)
FOREACH(b就地|集p:placegeo);

一旦符合这些特定条件,将退出案例块?我有两组条件(即statusLat和plateLat条件)的计算结果均为真的节点,但我只希望它尝试第一个案例块,如果为真,则退出。这就是解决问题的方法吗?在我看到你的第一个答案并做出回应后,我有一种感觉,那就是解决问题的方法。这是唯一的办法吗?这意味着,我实现的每个标签都需要在它之前检查每个案例的唯一条件子句……没有其他方法可以做到这一点吗?这是我想到的唯一答案。