Neo4j匯入CSV與情境查詢-下

neo4j csv new-下

在執行完以上所有的語法之後,我們先呼叫 call db.schema.visualization 這個語法來查看目前的 graph 的 schema 是怎樣的表示。在第 3 點就對所有的人進行了 地址、 電話的關聯;而在第 4 點的語法,則會是將 姓名 這個 label 的所有 node 裡的 姓名關係人 屬性 相互去做查詢,所以可以看到它所顯示的自己對自己進行了 relation 的關聯。

graph schema

graph schema

如果你覺得 graph schema 過於抽象,不太了解資料實際上是去如何關聯,前述直接查看整體 graph 就很方便,我們可以呼叫 match (n) return n 來查詢這個 database 裡所有的節點與關係。由於我們使用了一個簡易的測試資料,因此可以很快速地從這張圖看到有些 insight。

  1. 0922-33…、0923-18… 以及 02-7701 這 3 組電話號碼都有被一個人以上使用。
  2. 0922-33…以及 02-7701 的共用人,他們之間有多了一層關聯性。
  3. 陳冠瑋 與 林福堂 互為關係人

當然如果資料一多,就無法這樣很快速地看了。

正確的關聯結果

正確的關聯結果

情境範例說明

在一般狀況下,有時候會出現共同聯絡資訊是很正常的,可能他們之間有某種關係造成客戶允諾理專填寫自己聯絡資訊。但本次情境希望是可以找到在客戶可能不知情的狀況下被盜用了身分挪用作為可能非法的行為,因此如果可以篩選相同聯絡資訊且有共同關係的案例的話,就可以排除此類可能無關的狀況。簡單來說我們希望找出….  
⚠️ 有關係就沒關係,沒關係就是有關係

接下來我們會對以下這三種情境詳細解說

  1. 查詢共同電話
  2. 查詢共同電話之有關係人(3階內)
  3. 查詢共同電話 但 沒有共同關係人

查詢共同電話

這個為最基本的查詢,只要尋找 姓名 有共同連結到 電話 的結果即可。

你可能會想問,我不需要再增加條件 WHERE 電話.電話 = 電話.電話 嗎? 這要用 graph 的思維去思考,每一個 label 都有其指定的屬性,我們在一開始建立關聯的時候就已經逐條的去將 姓名 關聯到對應的 電話 ,所以到最後已經不同 姓名 所建立的關聯將會指向同一個 電話。

MATCH p=(:姓名)-[:have_phones]-(:電話)-[:have_phones]-(:姓名)
RETURN *
查詢共同電話 結果

查詢共同電話 結果

查詢共同電話之有關係人(3階內)

這個情境是要找出 有關係就沒關係 的人,雖然並不是主要的重點,但為了讓大家了解所謂 2 個 姓名 之間有共同連結同一個 電話 且有共同關係人(姓名) 是怎麼樣的情境。這其中的關聯還可以指定要有多少階層。

[:relation*1..3] 代表著查詢 relation 這個關聯,但要在1~3階以內。

MATCH p=(aP:電話)-[:have_phones]-(:姓名)-[:relation*1..3]-(:姓名)-[:have_phones]-(bP:電話)
WHERE aP.`電話` = bP.`電話`
RETURN *

這段 Cypher 可能對新手並不是那麼好理解,那麼以下的圖解會對你些許幫助。這張圖是與這個查詢語法相對應的,所以你可以很明白,它其實就是一個 cycle path ,環的起點與終點都是 電話 中間的連結點是由其所屬的 姓名 以及最重要的 關係 relation 所連起來的。

查詢共同電話之有關係人(3階內) 語法 示意圖

查詢共同電話之有關係人(3階內) 語法 示意圖

查詢共同電話之有關係人(3階內) 結果

查詢共同電話之有關係人(3階內) 結果

查詢共同電話 但 沒有共同關係人

這裡就是本次情境的重點了,尋找 沒關係就有關係 的人。因此重複利用第一點的 查詢共同電話 再多加一條 WHERE Not (a)-[:relation*1..3]-(b) 進行條件篩選即可。但如果你很細心就會發現,我前後的 label 都各自加上了變數 a, b ,這是為了給關聯 [:relation*1..3] 的前後節點做辨識,因為在前面的 MATCH 並沒有講到這個關聯。

MATCH p=(a:姓名)-[:have_phones]-(aP:電話)-[:have_phones]-(b:姓名)
WHERE Not (a)-[:relation*1..3]-(b)
RETURN *
查詢共同電話 但 沒有共同關係人 結果

查詢共同電話之有關係人(3階內) 結果

補充說明

Graph 顯示亂碼該如何解決?

亂碼問題為使用了非英文的語言,本範例使用的是中文,所以在實作時很有可能會遇到這個問題。

放心,neo4j 支援繁體中文的。這只是編碼問題,可以使用 notepad++(其他文字編譯器也可) 對檔案進行編碼成 UTF-8 再存檔覆蓋即可解決這個問題唷 !

Graph 顯示亂碼該如何解決

查詢共同電話之有關係人(3階內) 結果

專人協助

由偉康業務人員為您詳細說明偉康的解決方案,以及相關產業經驗。

立即訂閱電子報

掌握最新科技趨勢!