根据数据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 只选择一个表达式来代替另一个表达式进行计算;不允许在内部使用 MATCHCREATE 等。对于这样的查询,您想要做的基本上是制作一个行列表,将该列表过滤成三个单独的列表以用于特定类型的行,然后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执行操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Neo4j 中根据日期顺序创建关系

根据节点的 id 将节点从 CSV 加载到 Neo4j 中?

根据 Cypher neo4j 中的属性值总和创建新关系?

Python操作Neo4j图数据库的两种方式

使用Antlr4和neo4j解析sql生成数据地图

Neo4j在链接在一起的节点上对相同属性执行平均操作