Neo4j匯入CSV與情境查詢-下

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

graph schema
如果你覺得 graph schema 過於抽象,不太了解資料實際上是去如何關聯,前述直接查看整體 graph 就很方便,我們可以呼叫 match (n) return n 來查詢這個 database 裡所有的節點與關係。由於我們使用了一個簡易的測試資料,因此可以很快速地從這張圖看到有些 insight。
- 0922-33…、0923-18… 以及 02-7701 這 3 組電話號碼都有被一個人以上使用。
- 0922-33…以及 02-7701 的共用人,他們之間有多了一層關聯性。
- 陳冠瑋 與 林福堂 互為關係人
當然如果資料一多,就無法這樣很快速地看了。

正確的關聯結果
情境範例說明
接下來我們會對以下這三種情境詳細解說
- 查詢共同電話
- 查詢共同電話之有關係人(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階內) 結果
查詢共同電話 但 沒有共同關係人
這裡就是本次情境的重點了,尋找 沒關係就有關係 的人。因此重複利用第一點的 查詢共同電話 再多加一條 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 再存檔覆蓋即可解決這個問題唷 !

查詢共同電話之有關係人(3階內) 結果
圖/文:Rod
專人協助
由偉康業務人員為您詳細說明偉康的解決方案,以及相關產業經驗。