我一直在使用cypher和neo4j一段时间了,我一次又一次地遇到类似的问题.
我希望能够将"临时"属性添加到仅存在于返回数据中的节点,并且不会持久保存到Neo4j数据库.
例如,我正在处理的当前问题在图数据库中给出了一个N-ary树结构,我想返回一个特定节点的子节点,以及一个信息布尔让我知道那些孩子有孩子的天气.
获取此信息的查询非常简单:
MATCH (parent:Item { guid: "Identifier here" })-[:HASCHILD]->(child:Item)
OPTIONAL MATCH (child)-[:HASCHILD]->(grandchild:Item)
WITH parent, child, LENGTH(COLLECT(grandchild)) > 0 AS has_children
Run Code Online (Sandbox Code Playgroud)
现在我有父母,孩子和布尔让我知道天气还有更多的孩子.
我希望接下来要做的是将has_children布尔值设置为子节点上的属性,但仅仅为了返回查询,我不需要该属性保持不变.
我知道有一些解决方案可以获得我想要的东西但是没有一个是我想要的.
1)我可以创建一个临时节点:(继续上面的查询)
...
WITH parent, child, LENGTH(COLLECT(grandchild)) > 0 AS haschildren,
{
childkey1: child.childkey1,
childkey2: child.childkey2,
...
has_children: haschildren
} AS tempnode
RETURN parent, tempnode
Run Code Online (Sandbox Code Playgroud)
这个解决方案不是很好,你必须知道你正在处理的节点的确切节点类型和所有属性,它在一般情况下不起作用.
2)我可以设置并删除布尔值,暂时将其保存到数据库中(如在Cypher中的Neo4J创建临时变量中所述).
这不是很好,因为它会导致多个数据库写入(添加和删除).此外,它不像选项1那样动态,因为它只能处理简单类型.(选项1可以处理更复杂的情况,例如添加节点集合而不是简单的布尔值).
据我所知,这些是临时返回数据的唯一选择.我想知道我错过了什么吗?是否有可能使这更简单或更动态?
有点像
WITH parent, child, LENGTH(COLLECT(grandchild)) > 0 AS haschildren,
TEMPSET child.has_children = haschildren
Run Code Online (Sandbox Code Playgroud)
请注意,我已经简化了一些示例.我在neo4j中的不同上下文中多次遇到过这个问题.大多数情况下,我要么使用选项1,要么在查询返回后通过应用程序端的后处理构建正确的结构.
有没有更好的办法?
给定一个值为 jsonb 的字段
{
values: [null, 'test', { key: 'value' }]
}
Run Code Online (Sandbox Code Playgroud)
是否有可能返回一个输出
{
values: [ 'test', { key: 'value' }]
}
Run Code Online (Sandbox Code Playgroud)
我查看了文档,发现了一些函数,例如 jsonb_strip_nulls() ,它仅适用于具有空值的键和 array_remove() ,我无法使用 jsonb 。
我会用
UPDATE table
SET data = jsonb_set(data, '{values}'::text[], jsonb_agg(elem), false)
FROM data,
jsonb_array_elements(data-> 'values') WITH ORDINALITY AS t(elem, nr)
WHERE jsonb_typeof(elem) <> 'null'
GROUP BY (data.id)
Run Code Online (Sandbox Code Playgroud)
这对于大多数情况都可以正常工作,但我需要它来处理这种情况:
{
values: [null, null, null]
}
Run Code Online (Sandbox Code Playgroud)
上述查询不返回
{
values: []
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下。
任何帮助都是appriced!谢谢...