iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 27
0
AI & Data

看圖說故事,讓 Neo4j 重新詮釋你的資料庫系列 第 27

使用 JavaScript API 開發 Neo4j 應用程式

昨天分享過了 Neo4j HTTP API 的使用,所以如果你知道怎麼使用 JavaScript 呼叫 HTTP API,其實就可以在網頁實作圖形資料的應用了。

以下是透過 jQuery ajax 來達成與 Neo4j 資料庫的互動,大概比較需要注意的就是記得給 Authorization header,以及 data 要經過 JSON.stringify 處理。

$.ajax({
    type: 'POST',
    headers: {
        'Content-Type': 'application/json',
        Authorization: 'Basic bmVvNGo6bXlwYXNzd29yZA=='
    },
    url: 'http://localhost:7474/db/neo4j/tx',
    data: JSON.stringify({
        "statements": [
            {
                "statement": "CREATE (n:Person $props) RETURN n",
                "parameters": {
                    "props": {
                        "name": "Egg"
                    }
                },
            }
        ]
    }),
    success: function(msg) {
        console.log('transaction commit endpoint: ' + msg.commit);
        console.log('result: ' + msg.results);
        console.log('errors: ' + msg.errors);
    },
    error: function(msg) {
        console.log('http status: ' + msg.status);
        console.log('message: '+ msg.responseText);
    }
});

以 axios 達成與 Neo4j 資料庫的互動

axios({
    method: 'post',
    headers: {
        'Content-Type': 'application/json',
        Authorization: 'Basic bmVvNGo6bXlwYXNzd29yZA=='
    },
    url: 'http://localhost:7474/db/neo4j/tx',
    data: {
        "statements": [
            {
                "statement": "CREATE (n:Person $props) RETURN n",
                "parameters": {
                    "props": {
                        "name": "Egg"
                    }
                },
            }
        ]
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

使用 Neo4j JavaScript driver 存取資料庫

不過,Neo4j 官方也有包裝好的 JavaScript driver,使用上可能會更方便一些,不用再自己分清楚要打哪一支 http api,首先要加入以下其中一個 JavaScript 參考

<!-- 下載 js driver 後在本地參考引用 -->
<script src="lib/browser/neo4j-web.min.js"></script>

<!-- unpkg CDN,適合開發用,會自動取得最新版 -->
<script src="https://unpkg.com/neo4j-driver"></script>
<!-- unpkg CDN 壓縮版適合正式線上環境,版號須自行指定 -->
<script src="https://unpkg.com/neo4j-driver@4.1.2/lib/browser/neo4j-web.min.js"></script>

<!-- jsDelivr CDN,適合開發用,會自動取得最新版 -->
<script src="https://cdn.jsdelivr.net/npm/neo4j-driver"></script>
<!-- jsDelivr CDN 壓縮版適合正式線上環境,版號須自行指定 -->
<script src="https://cdn.jsdelivr.net/npm/neo4j-driver@4.1.2/lib/browser/neo4j-web.min.js"></script>

使用 JavaScript 得先宣告 driver 與 session 物件,並在執行完畢後下達 session.close()。

var driver = neo4j.driver(
    'neo4j://localhost',
    neo4j.auth.basic('neo4j', 'yourpassword')
)

var session = driver.session()

Subscriber API

const result = session.run(
    'CREATE (p:Person {name: $myname}) RETURN p',
    { myname: 'Egg' }
)
.subscribe({
    onKeys: keys => {
        console.log(keys)
    },
    onNext: record => {
        console.log(record.get('p'))
    },
    onCompleted: () => {
        session.close()
    },
    onError: error => {
        console.log(error)
    }
})

Promise API

const result = session.run(
    'CREATE (p:Person {name: $myname}) RETURN p',
    { myname: 'Egg' }
)
.then(result => {
    result.records.forEach(record => {
        console.log(record.get('p'))
    })
})
.catch(error => {
    console.log(error)
})
.then(() => session.close())

讀取資料庫,隱性交易

單次讀取的交易不需要明確的下達 Commit,而是會自動 Commit

var readTxResultPromise = session.readTransaction(txc => {
    var result = txc.run('MATCH (p:Person) RETURN p')
    return result
})

readTxResultPromise.then(result => {
    console.log(result.records)
})
.catch(error => {
    console.log(error)
})
.then(() => session.close())

寫入資料庫,癮性交易

單次寫入的隱性交易一樣不用明確的下達 Commit

var writeTxResultPromise = session.writeTransaction(async txc => {
    var result = await txc.run(
        "MERGE (alice:Person {name : 'Alice'}) RETURN alice"
    )
    return result
})

writeTxResultPromise.then(result => {
    console.log(result)
})
.catch(error => {
    console.log(error)
})
.then(() => session.close())

寫入資料庫,顯性交易

以下是明確執行一個交易

const txc = session.beginTransaction()
try {
    const result1 = await txc.run(
        'MERGE (bob:Person {name: $nameParam}) RETURN bob.name AS name',
        { nameParam: 'Bob' }
    )

    const result2 = await txc.run(
        'MERGE (adam:Person {name: $nameParam}) RETURN adam.name AS name',
        { nameParam: 'Adam' }
    )

    await txc.commit()
    console.log('committed')
} catch (error) {
    console.log(error)
    await txc.rollback()
    console.log('rolled back')
} finally {
    await session.close()
}

以上就是以 JavaScript driver 存取 Neo4j 資料庫,可以看到原本需要明確指定的 HTTP GET、POST、DELETE 以及 API endpoint /tx, /tx/{transaction_id}/commit,HTTP body 的處理細節都被隱藏了,操作也更為彈性。

參考資源:
https://neo4j.com/docs/api/javascript-driver/current/
https://neo4j.com/developer/javascript/


上一篇
使用 HTTP API 開發 Neo4j 應用程式
下一篇
使用 Golang Driver 開發 Neo4j 應用程式
系列文
看圖說故事,讓 Neo4j 重新詮釋你的資料庫30

尚未有邦友留言

立即登入留言