提问人:Tony Riddle 提问时间:11/13/2023 更新时间:11/15/2023 访问量:63
Noe4j :如何获取给定节点标签的计数为非空或非空值的属性名称
Noe4j : how to get property names with count of non-null or non-empty value for a given node label
问:
因此,需要计算给定节点标签的所有属性的非 null 和非空值的出现次数。
例如
MATCH(p:Person)
WHERE p.name IS NOT NULL and p.name <> ""
RETURN COUNT(p.name);
这给了我一个节点标签的名称属性计数,我必须获取该节点标签的其他 200 个属性的计数。我能够获得属性的计数,但我不确定是否具有上述条件计数。任何事情都会有所帮助,因为我刚刚开始学习 neo4j。Person
我用于所有属性计数的查询是
MATCH(p:Person)
WITH p
UNWIND keys(p) as key
WITH key, COUNT(keys(p)) as cnt
RETURN DISTINCT key, cnt
ORDER BY key
查询中需要修改哪些内容?或者我的查询一开始就是错误的。提前致谢。
答:
1赞
Finbar Good
11/13/2023
#1
如果要从 中的节点推断可能的属性,则可以通过以下命令获取非空属性的计数:Person
MATCH
MATCH (p:Person)
UNWIND keys(p) AS key
WITH key, CASE WHEN p[key] <> "" THEN 1 ELSE 0 END AS isNonEmpty
RETURN key, sum(isNonEmpty) AS cnt
ORDER BY key
请注意,由于 Neo4j 将 null 属性视为不存在,因此如果语句返回的节点都没有该属性,则无法推断这些属性。MATCH
可以很容易地调整为从计数中排除其他属性值。例如,要排除空列表,可以编写:CASE
MATCH (p:Person)
UNWIND keys(p) AS key
WITH key,
CASE p[key]
WHEN [] THEN 0
WHEN "" THEN 0
WHEN 0 THEN 0
ELSE 1
END AS isNonEmpty
RETURN key, sum(isNonEmpty) AS cnt
ORDER BY key
例如,如果您因为知道架构而提前知道这些属性,则可以将它们作为列表或记录集提供。例如,如果属性为 到 ,则可以使用以下命令:'a'
'g'
UNWIND ['a', 'b', 'c', 'd', 'e', 'f', 'g'] AS key
MATCH (p)
WITH key, CASE WHEN p[key] <> "" THEN 1 ELSE 0 END AS isNonEmpty
RETURN key, sum(isNonEmpty) AS cnt
ORDER BY key
评论
0赞
Tony Riddle
11/14/2023
我运行了您的查询并得到了响应。不过有一个问题。此查询不包括 0 次出现?例如,如果有一个属性名称具有空值“”或仅具有 null 值。它不包括在列表中。我有 200 个属性,它返回 160,这意味着 40 个具有 null 或空值。但我想将这 40 个也与发生次数 0 相加。我需要使用什么条款?感谢您提供的查询。bornIn
0赞
Finbar Good
11/14/2023
好的,我已经更新了答案以计算这些。
0赞
Tony Riddle
11/14/2023
我们如何扩展此查询以添加过滤器,不仅为空值,还为空列表和其他类型添加过滤器。我已经尝试了您的查询扩展子句,但这没有给出正确的输出""
[]
case
CASE WHEN p[key] <> "" THEN 1 WHEN p[key] <> [] THEN 1 ELSE 0 END AS isNonEmpty
0赞
Finbar Good
11/15/2023
我更新了答案以显示如何扩展语句CASE
0赞
cybersam
11/14/2023
#2
[更新]
聚合函数(如 already 由非聚合表达式(如 )分组,因此不需要。并且 的比较被 考虑,因此显式测试将是多余的。COUNT
key
DISTINCT
NULL
false
WHERE
NULL
下面是一个使用:
它还将返回始终为空的属性的计数。0
MATCH (p:Person)
UNWIND KEYS(p) AS key
RETURN key, SUM(TOINTEGER(NOT ISEMPTY(p[key]))) AS cnt
ORDER BY key
您应该对问题的建议答案中的查询进行分析,看看哪个查询使用的数据库命中最少。
此外,如果有意义,则应考虑删除所有具有空字符串值的属性(如果应将其视为不存在)。这将允许您使用更简单、更快速的查询。
评论
0赞
Tony Riddle
11/14/2023
感谢您的查询。您的查询给出的输出与 finbar 类似。它不包括出现次数为 0 的属性。例如,如果有一个属性名称具有空值“”或仅具有 null 值。它不包括在列表中。我们如何扩展您的查询以添加过滤器,例如除了检查空值“”之外,我们还可以检查空列表或空对象。因为属性可能不仅仅是类型。bornIn
string
0赞
cybersam
11/15/2023
请参阅我更新的答案。对于始终为空的属性,它将返回 0 计数,并将检测所有类型的“空”值。
上一个:NEO4j中的测试值
评论