使用单个Cypher查询,如果节点属性不存在,则初始化并返回节点属性。

4
我正在寻找一个单一的Cypher查询,它将增加一个整数节点参数并返回该值,同时在不存在该参数时将其初始化为0。
类似以下伪代码Cypher:
MATCH (n:Order)
IF n.product_count IS NULL THEN n.product_count = 0 // this line is what I need
SET n.product_count = n.product_count + 1
RETURN n.product_count

我能够使用一个带有FOREACH语句的查询来完成工作,但这似乎很笨拙,并不适合我的用例。
MATCH (n:Order)
WHERE id(n) = 9503
FOREACH ( i in (CASE WHEN n.product_count IS NULL THEN [1] ELSE [] END) | SET n.product_count = 0 )
SET n.product_count = n.product_count + 1
RETURN n.product_count; 

这应该如何正确完成?
注意:`Order`节点非常复杂,包含许多其他属性,因此在这种情况下使用`MERGE`语句将是高度不希望的。
1个回答

9
Neo4j提供了一个称为coalesce的有用功能,可用于此类情况。
Coalesce接受任意数量的参数,并返回第一个不为NULL的参数。在所有参数均为NULL的情况下,它只返回NULL。
例如:
coalesce(NULL, 1) // equates to 1
coalesce("hello", 6) // equates to "hello"
coalesce(NULL, "world", NULL) // equates to "world"
coalesce(NULL, NULL) // equates to NULL

因此,您的查询将类似于以下内容:
MATCH (n:Order)
SET n.product_count = coalesce(n.product_count, 0) + 1
RETURN n.product_count

这是有关coalesce的官方文档:

http://neo4j.com/docs/stable/query-functions-scalar.html#functions-coalesce


1
好东西,谢谢!我竟然没想到在这里使用 coalesce - Maciej Sz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接