2015-11-09 47 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