如何在node.js中使用neo4j
本章中你将会学到如何在node.js中使用neo4j图形数据库。
当你想存储或者查询和数据紧密关联的数据的时候,图形数据库很有用。
neo4j是一个可有效存储,处理和查询你数据模型中紧密相连的元素的数据库。
neo4j有很强大且灵活的数据模型,你可以使用其来表示你真实的,易变结构的信息,且不失真。
使用内置的REST API来和Neo4j通讯
Neo4j数据库有内在的HTTP REST接口,我们可以使用其直接和Neo4j数据库交接(interface)。
你需要简单的使用POST向一个HTTP URL发送请求,且接受来自Neo4j的响应。
在下面的实例中你可以看见Node.js请求模块调用了REST,在请求模块(request module)中这样做很便利。
安装request模块是:
> npm install request
让我们创建一个空的文件,且在文档中写下下述代码:
//Let’s load the request module
var request = require("request");
上面我们将使用require函数来在我们的项目中加载request模块
创建一个将会触发密码查询(cypher query)的方法:
下面我们将要创建一个函数,使用密码查询(cypher query)作为输入,且使用HTTP接口在数据库中触发这个密码查询(cypher query)。我们在manual中可以详尽看到端点协议(endpoint protocol)和格式。你可以使用其做更多的事情:例如,在每个请求中发送很多标准 或者 在众多请求中保持通讯打开(keep transactions)。你可在neoe4j手册中多看看。
下面让我们定义数据库的host
//Define your host and port. This is where your database is running. Here it is defined on localhost.
var host = 'localhost',
port = ;
定义我们需要连接的URL,在Neo4说明文档中指明:
//This is the URL where we will POST our data to fire the cypher query. This is specified in Neo4j docs.
var httpUrlForTransaction = 'http://' + host + ':' + port + '/db/data/transaction/commit';
接下来,你需要定义可将cyper作为参数的函数,用来执行密码查询。
参数可以是任何的用来密码查询的参数,且当数据库有响应的时候要触发回调函数。
//Let’s define a function which fires the cypher query.
function runCypherQuery(query, params, callback) {
request.post({
uri: httpUrlForTransaction,
json: {statements: [{statement: query, parameters: params}]}
},
function (err, res, body) {
callback(err, body);
})
}
触发一些查询:
现在我们需要一个可以在neo4.js中触发查询的函数,让我们通过保存neo4j中一个节点的方法来使用这个函数。
/**
* Let’s fire some queries below.
* */
runCypherQuery(
'CREATE (somebody:Person { name: {name}, from: {company}, age: {age} }) RETURN somebody', {
name: 'Ghuffran',
company: 'Modulus',
age:
}, function (err, resp) {
if (err) {
console.log(err);
} else {
console.log(resp);
}
}
);
在上面的例子中,我们使用了一个密码查询来保存节点(node)
注意:使用上述的参数来进行查询是好想法。因为Neo4j缓存查询路径,然后结合我们传递的不同参数来运行这个查询路径。这增加了查询执行的速度。
现在让我们总结上面的所有代码,我们的文件应该看上去是:
//Let’s load the request module
var request = require("request"); //Define your host and port. This is where your database is running. Here it’s on localhost.
var host = 'localhost',
port = ; //This is the url where we will POST our data to fire the cypher query. This is specified in Neo4j docs.
var httpUrlForTransaction = 'http://' + host + ':' + port + '/db/data/transaction/commit'; //Let’s define a function which fires the cypher query.
function runCypherQuery(query, params, callback) {
request.post({
uri: httpUrlForTransaction,
json: {statements: [{statement: query, parameters: params}]}
},
function (err, res, body) {
callback(err, body);
})
} /**
* Let’s fire some queries as shown below.
* */
runCypherQuery(
'CREATE (somebody:Person { name: {name}, from: {company}, age: {age} }) RETURN somebody', {
name: 'Ghuffran',
company: 'Modulus',
age:
}, function (err, resp) {
if (err) {
console.log(err);
} else {
console.log(resp);
}
}
);
现在我们只要使用内置的HTTP REST API和Neo4j 数据库进行交接就可。
使用Node.js 的node-neo4j(philippkueng)模块和neo4j进行通信
你可使用一些模块来和Node.js只的neo4j进行interface,但是node-neo4j(Thingdom)和node-neo4j(philipkueng)是使用最广泛的。
你可以根据个人喜好进行选择使用。
下面例子中使用的是node-neo4j()philippkueng模块,因为其利于说明:
我们可以加载这个模块:
> npm install node-neo4j
现在让我们看看如何使用node-neo4j模块来触发密码查询,就像使用其他的对象接口一样。
//Require the Neo4J module
var neo4j = require('node-neo4j'); //Create a db object. We will using this object to work on the DB.
db = new neo4j('http://localhost:7474'); //Run raw cypher with params
db.cypherQuery(
'CREATE (somebody:Person { name: {name}, from: {company}, age: {age} }) RETURN somebody',
{
name: 'Ghuffran',
company: 'Modulus',
age: ~~(Math.random() * ) //generate random age
}, function (err, result) {
if (err) {
return console.log(err);
}
console.log(result.data); // delivers an array of query results
console.log(result.columns); // delivers an array of names of objects getting returned
}
);
上麦我们使用模块提供的db.cypherQuery(query, [params|Optional], [include_stats|Optional], callback) 方法来运行我们的密码查询。
node-neo4j模块提供了一系列的帮助方法。
让我们看看我们如何通过使用帮助函数来保存我们的节点。
//Require the Neo4J module
var neo4j = require('node-neo4j'); //Create a db object. We will using this object to work on the DB.
db = new neo4j('http://localhost:7474'); //Let’s create a node
db.insertNode({
name: 'Ghuffran',
company: 'Modulus',
age: ~~(Math.random() * )
}, function (err, node) {
if (err) {
return console.log(err);
} // Output node data.
console.log(node);
});
上面我们使用 db.insertNode 来帮助我们创建一个特殊的节点。
存在一些可以用来更新,读取和删除的方法,你可使用这些方法和neo4j数据库进行交互,而不需要处理密码查询。你可以在API文档中查看更多。
如何在node.js中使用neo4j的更多相关文章
- 如何在Node.js中合并两个复杂对象
通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...
- 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...
- Node.js中的Session,不要觉得简单哦。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...
- Node.js 中MongoDB的基本接口操作
Node.js 中MongoDB的基本接口操作 连接数据库 安装mongodb模块 导入mongodb模块 调用connect方法 文档的增删改查操作 插入文档 方法: db.collection(& ...
- 在node.js中使用COOKIE
node.js中如何向客户端发送COOKIE呢?有如下两个方案: 一.使用response.writeHead,代码示例: //设置过期时间为一分钟 var today = new Date(); v ...
- 初步揭秘node.js中的事件
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
- Node.js权威指南 (10) - Node.js中的错误处理与断言处理
10.1 使用domain模块处理错误 / 272 10.1.1 domain模块概述 / 272 10.1.2 创建并使用Domain对象 / 274 10.1.3 隐式绑定与显式绑定 / 276 ...
- Node.js中的URL
Node.js中的URL 什么是URL URL是Uniform Location Resource的缩写,翻译为"统一资源定位符",也就是描述资源位置的固定表示方法.被URL描述的 ...
- mysql语句在node.js中的写法
总结一下mysql语句在node.js中的各种写法,参考了npm网站mysql模块给的实例. 查询 select //1 db.query('select * from tuanshang_users ...
随机推荐
- 【Mac系统】之破解Navicat Premium for Mac(中文版)
前期准备工作: 下载Mac中文版本: 下载地址:链接:https://pan.baidu.com/s/1wShOFK9odsSWBSphgqTdEQ 密码:ipsa 下载完成后进行安装,安装步骤省略 ...
- 转载 jenkins执行selenium 测试 浏览器不显示解决方法
原文地址: http://blog.csdn.net/achang21/article/details/45096003 The web browser doesn't show while run ...
- 【php】global的使用与php的全局变量
php的全局变量和其余编程语言是不同的,在大多数的编程语言中,全局变量在其下的函数.类中自己主动生效.除非被局部变量覆盖,或者根本就不同意再声明同样名称与类型的局部变量.可是php中的全局变量不是默认 ...
- 《C++游戏开发》笔记十一 平滑动画:不再颤抖的小雪花
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9430645 作者:七十一雾央 新浪微博:http:/ ...
- Struts中类型转换踩的坑
出现的异常: 当我输入的数据很大时候,转换后如上,这并不是我想要的, 出现问题的原因: Struts2对常用的数据类型如String.Integer.Double等都添加了转换器进行对应的转换操作. ...
- Delphi中Message消息的三种使用方法(覆盖WndProc,覆盖消息函数,改写WMCommand)
实例1 unit Unit1; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...
- BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探
貌似$BZOJ$上并没有这个题... 是嫌这个题水了么... 还是要氪金权限号??? 这里附上洛谷的题面:洛谷P4767 [IOI2000]邮局 题目描述 高速公路旁边有一些村庄.高速公路表示为整数轴 ...
- linux c编程:线程退出
在线程创建的时候pthread_exit都是调用的固定参数,我们先来看下如果用自动变量作为pthread_exit的参数时出现的问题 typedef struct foo{ int a; int b; ...
- 016-Spring Boot JDBC
一.数据源装配 通过查看代码可知,默认已装配了数据源和JdbcTemplate System.out.println(context.getBean(DataSource.class)); Syste ...
- 寻找第K大 网易2016实习研发工程师编程题
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2] ...