2015-11-09 49 views
0

我有一个动态密码,读起来像这样。Neo4j:Cypher - 从列表列表中计算空值的数量

MATCH (n {company_id: 105, company_site_id:555,level:0}) 
OPTIONAL MATCH(n1 {company_id:105, company_site_id:555,name:"price"}) 
OPTIONAL MATCH(n2 {company_id:105, company_site_id:555,name:"quote"}) 
RETURN 
    n.company_id , 
    CASE WHEN n1.name IS NOT NULL THEN n1.name 
     WHEN n1.name IS NULL THEN   
     'None'  
    END AS n1name, 
    n1.property, 
    CASE WHEN n2.name IS NOT NULL THEN n2.name 
     WHEN n2.name IS NULL THEN 
     'None' 
    END AS n2name, 
    n2.property 

目的暗号的:

甲动态构建暗号,其用于验证某些节点的存在。如果节点存在,则返回其他名称'None'。

我的要求:

我想检查它的值是“无”的总列数的手段。

在上面的例子中,我有2列/节点(n1,n2),我需要计数'无'。

对于任何指针都会很感激。

谢谢。

回答

1

您的公司节点上没有标签吗?应该更容易用标签来做。

我想你应该只需在您Where条款符合“空”的一部分,那么你就必须返回一个计数():

MATCH (n {company_id: 105, company_site_id:555,level:0}) 
OPTIONAL MATCH(n1 {company_id:105, company_site_id:555,name:"price"}) 
WHERE 
    n1.name is null 
WITH n1 
OPTIONAL MATCH (n2 {company_id:105, company_site_id:555,name:"quote"}) 
WHERE 
    n2.name is null 
RETURN 
    count(n1) as n1s, count(n2) as n2s 

随着Labels,你可以做这样的(假设使用标签是Company):

Match (c:Company) 
WHERE c.name IS NULL 
RETURN 
    count(c) 
1

你的数据模型是好不尴尬? 你的n1和n2不应该通过关系连接到n而不是重复所有的数据?

MATCH (n:Company {company_id: 105, company_site_id:555,level:0}) 
OPTIONAL MATCH(n1:Company {company_id:105, company_site_id:555,name:"price"}) 
OPTIONAL MATCH(n2:Company {company_id:105, company_site_id:555,name:"quote"}) 
RETURN 
    n.company_id , 
    coalesce(n1.name,'None') as n1name, 
    n1.property, 
    coalesce(n2.name,'None') as n2name, 
    n2.property 
    sum(case n1.name when null then 1 else 0) + 
    sum(case n2.name when null then 1 else 0) as null_names