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

zvms9eto  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(110)

因此,需要对给定节点标签的所有属性的非null和非空值的出现次数进行计数。
比如说,

MATCH(p:Person) 
WHERE p.name IS NOT NULL and p.name <> "" 
RETURN COUNT(p.name);

字符串
这给了我一个节点标签Person的名称属性的计数,我必须得到这个节点标签的其他200个属性的计数。我能够得到属性的计数,但我不确定上面的条件计数。任何东西都是有帮助的,因为我刚刚开始学习neo4j。
我对所有属性计数使用的查询是

MATCH(p:Person)
WITH p
UNWIND keys(p) as key
WITH key, COUNT(keys(p)) as cnt
RETURN DISTINCT key, cnt
ORDER BY key


查询中需要修改什么?或者我的查询一开始就错了。提前感谢。

9lowa7mx

9lowa7mx1#

如果您从MATCH中的Person节点推断可能的属性,则可以使用以下内容获取非空属性的计数:

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

isr3a4wc

isr3a4wc2#

[已删除]
COUNT这样的Aggregating functions已经被像key这样的非聚合表达式分组,所以不需要DISTINCT。与NULL的比较被认为是false乘以WHERE,所以显式的NULL测试是多余的。
下面是一个使用的查询:

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

它还将为始终为空的属性返回0计数。

MATCH (p:Person)
UNWIND KEYS(p) AS key
RETURN key, SUM(TOINTEGER(NOT ISEMPTY(p[key]))) AS cnt 
ORDER BY key

字符串
您应该分析您的问题的建议答案中的查询,看看哪一个使用最少的DB命中。
此外,如果有意义的话,你应该考虑删除所有具有空字符串值的属性,如果它们应该被认为是不存在的。这将允许你使用更简单和更快的查询。

相关问题