2016-06-28 63 views
3

我有一個很大的圖,其中有代表人的節點。他們都有名字和姓氏屬性,有些具有中間名屬性。我正在尋找可能代表同一個人的節點,所以我正在查看不同的名稱排列。我目前正在比較姓氏和名字的第一個首字母[某些節點只有首字母],但不知道如何檢測中間名是否存在。Neo4j Cypher - 比較屬性值,如果它們存在?

我當前的查詢是:

match (a:Author), (b:Author) 
where 
    a.surname=b.surname and 
    (a.firstname starts with 'A' and b.firstname starts with 'A') 
return distinct a,b 

我的理解是,可選MATCH僅指模式,這樣就不會工作。我無法找到寫出有意義的if語句的方法。

這可能是對我來說更有意義的做,而不是僅僅依靠直接的Cypher查詢,但我希望保持它非常簡單,只需在Cypher中完成。

一些例子來闡明我想要做什麼。

實施例1:

Node 1: firstname "John" middlename "Patrick" lastname "Smith" 
    Node 2: firstname "J" middlename "P" lastname "Smith" 
    Node 3: firstname "J" middlename "Q" lastname "Smith" 
    Node 4: firstname "J" lastname "Smith" 

我想要的查詢將返回節點1,2,和4 '匹配'。

例2:

Node 1: firstname "Jane" lastname "Smith" 
Node 2: firstname "J" middlename "P" lastname "Smith" 
Node 3: firstname "J" middlename "Q" lastname "Smith" 
Node 4: firstname "J" lastname "Smith" 

在這裏,我希望所有的4個節點,因爲 '規範' 的名字沒有一箇中間名。

+0

您可能希望更清楚地闡明什麼是你現在要做的,因爲「無法弄清楚如何測試中間名如果它們存在「導致我告訴你使用'EXISTS'並得到它的贊成票。 – joslinm

+0

謝謝,希望我的擴展示例更好地闡明。 FWIW,我沒有讓你失望。對我來說,你的評論是一個跡象,我沒有清楚地解釋我試圖解決的問題。 – betseyb

回答

2

我認爲你需要像下面這樣:

match (a:Author), (b:Author) 
where 
    id(a) < id(b) and 
    (a.surname=b.surname) and 
    (a.firstname starts with 'A' and b.firstname starts with 'A') and 
    (a.middlename=b.middlename OR a.middlename IS NULL OR b.middlename IS NULL) 
return a,b 

How to work with null是像你對付一個難題一個很好的參考。

編輯:讓我們打破它與一些僞代碼:

if (a.middlename is null) return true; 
if (b.middlename is null) return true; 
if (a.middlename is not null and b.middlename is not null and a.middlename!=b.middlename) return false; 
if (a.middlename is not null and b.middlename is not null and a.middlename=b.middlename) return true; 
+0

這不是正確的方法。 – joslinm

+0

這種說法背後有理由嗎?目前我無法自己測試它。 – Sevle

+0

根據我對有些難以理解的要求的理解,OP希望比較兩個都有中間名的人,並比較那些沒有中間名的人。您添加的最後一個條款基本上與每個人都匹配,除非他們具有完全相同的中間名(奇怪?)或者其中一個名稱爲零。 – joslinm