昨天分享过了 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,使用上可能会更方便一些,不用再自己分清楚要打哪一支 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...
今天要介绍的一种骇客攻击手法「伪造跨站请求」, 英文Cross-site request forge...
前情提要 前一篇带各位透过汇入 Session 达到不必输入帐号密码便可登入的目的。 开始之前 今天...
第三? 第二道墙那边,没什麽变化啊... 真是奇怪,R呢? R走到了灯塔的另外一边,另一边有什麽吗...
问世间Docker为何物,直教DotCloud以死相许,所以Docker到底是虾毁?不仅让当时云端巨...