上一篇文章分享了Neo4j大量匯入CSV的方法,今天想跟大家介紹匯入 API 的方式;這裡所說的 API 是指 Restful API,格式為 JSON,至於其他格式的 API 例如 XML,就請自行研究囉,我對它毫無興趣 XD;CSV 的話,就參考匯入 CSV 檔案即可。
APOC 全名是 Awesome Procedures on Cypher,是 Neo4j 的實驗室專案之一,集合了大約 400 個常用的預存程序或函數,如果您想自行開發預存程序或函數,記得先來這裡(Overview of APOC functions and procedures)找找,別重複造輪子唷!
第一次使用 APOC Library 時,是需要先安裝的,否則會遇到類似的錯誤訊息:
There is no procedure with the name
apoc.load.jsonParams
registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed.
安裝 APOC 有兩種選擇,您可以安裝在 Project 層級,那麼該 Project 內所有資料庫都可以使用 APOC
或是只安裝給特定的資料庫
接下來就是重頭戲了,這次我們需要的是 apoc.load.json
和 apoc.load.jsonParams
兩個程序
Call JSON API with HTTP GET
以預設的 HTTP GET 方式打台灣斷層資料 API
WITH 'https://www.geologycloud.tw/data/zh-tw/ActiveFault' AS uri
CALL apoc.load.json(uri)
YIELD value
RETURN value
不過 apoc.load.json 可以設定的參數有限,如果您需要設定 HTTP Header 或 Post body,請改用 apoc.load.jsonParams,後者預設至少給三個參數如下
WITH 'https://www.geologycloud.tw/data/zh-tw/ActiveFault' AS uri
CALL apoc.load.jsonParams(uri, null, null)
YIELD value
RETURN value
很多情況下 API 會要求特定的 Header,設定方式如下,特別注意 Header name 有特殊字元時的標記方式。
WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
`X-Device-ID`: '263b651364d32caa6d'
}, null)
YIELD value
RETURN value
API 也常會要求認證以及 Content-Type
WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
`Content-Type`:'application/json',
`X-Device-ID`: '263b651364d32caa6d',
Authorization: '9643799475551d6bd710698'
}, null)
YIELD value
RETURN value
用 POST 打 API 並設定 POST body
WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
`Content-Type`:'application/json',
`X-Device-ID`: '263b651364d32caa6d',
Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', '', { METHOD: 'POST' })
YIELD value
RETURN value
直接存取回傳的 JSON 資料中特定欄位
WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
`Content-Type`:'application/json',
`X-Device-ID`: '263b651364d32caa6d',
Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', '', { METHOD: 'POST' })
YIELD value
RETURN value['data']['items']
RETURN 的部分也可以寫成
RETURN value.data.items
或是直接在 apoc 程序的參數中設定要讀取的欄位
WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
`Content-Type`:'application/json',
`X-Device-ID`: '263b651364d32caa6d',
Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', 'data.items', { METHOD: 'POST' })
YIELD value
RETURN value
如果要讀取陣列中特定的一筆,也可以用類似 data.items[1] 的寫法。
最後就是實際將 API 資料匯入資料庫的部分
WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
`Content-Type`:'application/json',
`X-Device-ID`: '263b651364d32caa6d',
Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', 'data.items', { METHOD: 'POST' })
YIELD item
CREATE (n:License {name: item.license})
RETURN *
以上就是比較常用的匯入 API 方式,更多的細節,我可能之後會原文編輯補充喔。