根据数据neo4j执行操作
Posted
技术标签:
【中文标题】根据数据neo4j执行操作【英文标题】:perform operations based on data neo4j 【发布时间】:2016-10-21 12:46:29 【问题描述】:我正在执行一个操作,根据一些需求需要操作,查询是::
MATCH (n:Label1)
OPTIONAL MATCH (n)-[:REL_1]-(e:Label2)
WITH n,e,
CASE
WHEN e IS NULL THEN
MERGE (ss:Label2sId:n.id)
ON MATCH SET ss.id = 1476988200, ss.setC = ss.setC +1,ss.nl = ss.nl + [4]
ON CREATE SET ss.id = 1476988200, ss.setC = 1,ss.nl = [6]
CREATE UNIQUE (n)-[:REL_1]->(ss)
WHEN e.id<1476988200 THEN
MERGE (ss:Label2 sId: n.id)
ON MATCH SET ss.id = 1476988200, ss.setC = ss.setC +1,ss.nl = ss.nl + [4]
ON CREATE SET ss.id = 1476988200, ss.setC = 1,ss.nl = [6]
CREATE UNIQUE (n)-[:REL_1]->(ss)
WHEN e.id=1476988200 AND e.setC < 3 THEN
MERGE (ss:Label2 sId: n.id)
ON MATCH SET ss.id = 1476988200, ss.setC = ss.setC +1,ss.nl = ss.nl + [4]
ON CREATE SET ss.id = 1476988200, ss.setC = 1,ss.nl = [6]
CREATE UNIQUE (n)-[:REL_1]->(ss)
END
虽然我在这里添加了相同的案例;每种情况都有不同的场景。
(由于我无法解释问题,所以我写了这个:: 抱歉)
但我收到类似 ::
的错误Invalid input ')': expected whitespace or a relationship pattern (line 6, column 36 (offset: 138))
为了实现这个::我试过这样(但仍然产生错误)::
MATCH (n:Label1)
OPTIONAL MATCH (n)-[:REL_1]-(e:Label2)
WITH n,e
WHERE e IS NULL OR e.id<1476988200 OR (e.id=1476988200 AND e.setC < 3)
WITH collect(n) as total_rows
FOREACH (i IN RANGE(0, size(total_rows)-1) |
FOREACH (sub IN [total_rows[i]] |
MERGE (ss:Label2 sId: sub.id)
ON CREATE SET ss.id = 1476988200, ss.setC = 1 AND ss.nl = [6]
ON MATCH SET CASE WHEN ss.id = 1476988200 THEN (ss.setC = ss.setC +1 AND ss.nl = ss.nl + [4]) WHEN ss.id< 1476988200 THEN (ss.id = 1476988200 AND ss.setC = 0 AND ss.nl = []) END
CREATE UNIQUE (sub)-[:REL_1]->(ss)
)
)
错误::Invalid input 'C': expected whitespace, comment or '.' (line 11, column 3 (offset: 553))
有什么问题?或者有没有其他方法可以解决这个问题。
【问题讨论】:
【参考方案1】:问题是CASE
只选择一个表达式来代替另一个表达式进行计算;不允许在内部使用 MATCH
、CREATE
等。对于这样的查询,您想要做的基本上是制作一个行列表,将该列表过滤成三个单独的列表以用于特定类型的行,然后UNWIND
并分别处理每个列表。更新:潜在空列表的解决方法很复杂,因此最简单的方法是使用三个单独的查询和UNION ALL
。
MATCH (n:Label1)
WHERE NOT (n)-[:REL_1]-(:Label2)
MERGE (ss:Label2 sId: n.id)
ON MATCH SET ss.id = 1476988200, ss.setC = ss.setC +1,ss.nl = ss.nl + [4]
ON CREATE SET ss.id = 1476988200, ss.setC = 1,ss.nl = [6]
CREATE UNIQUE (n)-[:REL_1]->(ss)
RETURN 'null_rows' AS type, COUNT(*) AS num
UNION ALL
MATCH (n:Label1)-[:REL_1]-(e:Label2)
WHERE e.id < 1476988200
MERGE (ss:Label2 sId: n.id)
ON MATCH SET ss.id = 1476988200, ss.setC = ss.setC +1,ss.nl = ss.nl + [4]
ON CREATE SET ss.id = 1476988200, ss.setC = 1,ss.nl = [6]
CREATE UNIQUE (n)-[:REL_1]->(ss)
RETURN 'less_than_rows' AS type, COUNT(*) AS num
UNION ALL
MATCH (n:Label1)-[:REL_1]-(e:Label2)
WHERE e.id = 1476988200 AND e.setC < 3
MERGE (ss:Label2 sId: n.id)
ON MATCH SET ss.id = 1476988200, ss.setC = ss.setC +1,ss.nl = ss.nl + [4]
ON CREATE SET ss.id = 1476988200, ss.setC = 1,ss.nl = [6]
CREATE UNIQUE (n)-[:REL_1]->(ss)
RETURN 'other_rows' AS type, COUNT(*) AS num
【讨论】:
谢谢,但如果“null_rows 和 less_than_rows”行不包含任何数据并且“other_rows”没有更新任何内容。意味着如果我删除所有上述条件(null_rows 和 less_than_rows)然后(other_rows)更新。出了什么问题..(抱歉延迟)UNWIND
一个空行将从您的查询中删除原始行(没有要为您的新别名创建的值)。您可以解决它,但对于这种情况,基本上只使用UNION
运行三个单独的查询会容易得多。确保您在:Label2(id)
和 :Label2(setC)
上有一个索引,以便从中获得最佳性能。以上是关于根据数据neo4j执行操作的主要内容,如果未能解决你的问题,请参考以下文章