Noe4j :如何获取给定节点标签的计数为非空或非空值的属性名称

Noe4j : how to get property names with count of non-null or non-empty value for a given node label

提问人:Tony Riddle 提问时间:11/13/2023 更新时间:11/15/2023 访问量:63

问:

因此,需要计算给定节点标签的所有属性的非 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

查询中需要修改哪些内容?或者我的查询一开始就是错误的。提前致谢。

NEO4J 密码器 NEO4J-APOC

评论


答:

1赞 Finbar Good 11/13/2023 #1

如果要从 中的节点推断可能的属性,则可以通过以下命令获取非空属性的计数:PersonMATCH

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
我们如何扩展此查询以添加过滤器,不仅为空值,还为空列表和其他类型添加过滤器。我已经尝试了您的查询扩展子句,但这没有给出正确的输出""[]caseCASE 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 由非聚合表达式(如 )分组,因此不需要。并且 的比较被 考虑,因此显式测试将是多余的。COUNTkeyDISTINCTNULLfalseWHERENULL

下面是一个使用:

  • ISEMPTY 检测所有“空”属性(带 、 或 值)。""[]{}
  • TOINTEGER 将布尔值转换为 1 (for ) 或 0。true

它还将返回始终为空的属性的计数。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 值。它不包括在列表中。我们如何扩展您的查询以添加过滤器,例如除了检查空值“”之外,我们还可以检查空列表或空对象。因为属性可能不仅仅是类型。bornInstring
0赞 cybersam 11/15/2023
请参阅我更新的答案。对于始终为空的属性,它将返回 0 计数,并将检测所有类型的“空”值。