使用 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/[email protected]/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/[email protected]/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/


<<:  [Day27] 第二十七课 Azure巢状虚拟化-2 [进阶]

>>:  DAY 28 第二十五件裁罚案 金管会银行局裁罚对象:财金资讯股份有限公司 裁罚日期:108/1/11

何谓资讯安全(资安)?

资讯安全在大部份的资安书籍都没有详细的定义,以下是我的 The Effective CISSP: S...

Generate CSRF PoC 伪造跨站请求漏洞利用产生

今天要介绍的一种骇客攻击手法「伪造跨站请求」, 英文Cross-site request forge...

【Day 22】- 将朋朋的 Instagram 贴文全部按赞owo(实战 Selenium 自动点击 Instagram 好友贴文赞 2/2)

前情提要 前一篇带各位透过汇入 Session 达到不必输入帐号密码便可登入的目的。 开始之前 今天...

虹语岚访仲夏夜-11(专业的小四篇)

第三?  第二道墙那边,没什麽变化啊... 真是奇怪,R呢? R走到了灯塔的另外一边,另一边有什麽吗...

Day3-DotCloud? Docker?

问世间Docker为何物,直教DotCloud以死相许,所以Docker到底是虾毁?不仅让当时云端巨...