让我们直接开始吧。你是一个对 Neo4j 感兴趣的JavaScript开发人员,想要建立一个网络应用、微服务或移动应用。
你已经阅读了Neo4j,玩了一些数据集,并且知道足够的 Cypher ,可以开始工作。现在,你正在寻找一个演示应用程序或模板来启动球 - 你来对地方了。
Movie
、 Person
、 Genre
和 Keyword
个节点,通过关系连接,如下图所示。 API。 应用程序的Node.js部分与数据库接口,并通过RESTful API将数据呈现给React.js前端。
前端。 前端,在这种情况下是用React.js构建的,消费由Express.js API提供的数据,并向用户展示一些视图,包括主页、电影详情页和人物详情页。
neo4j-import
。 如果你在Mac或Windows上,并且下载了.dmg或.exe版本的Neo4j,请尝试将导入脚本的 $NEO4J_HOME/bin/neo4j-import
部分替换成 适当的替换 。例如,这将是Neo4j 3.0.3上Windows的替代命令:
"C:\Program Files\Neo4j Community\jre\bin\java" -cp "C:\Program Files\Neo4j
Community\bin\neo4j-desktop-3.0.3.jar" org.neo4j.tooling.ImportTool --into database/
--nodes:Person csv/person_node.csv --nodes:Movie csv/movie_node.csv --nodes:Genre
csv/genre_node.csv --nodes:Keyword csv/keyword_node.csv --relationships:ACTED_IN
csv/acted_in_rels.csv --relationships:DIRECTED csv/directed_rels.csv
--relationships:HAS_GENRE csv/has_genre_rels.csv --relationships:HAS_KEYWORD csv/has_keyword_rels.csv --relationships:PRODUCED csv/produced_rels.csv
--relationships:WRITER_OF csv/writer_of_rels.csv --delimiter ";" --array-delimiter "|"
--id-type INTEGER
api
目录中。 为了运行API,你需要打开一个新的终端标签,并移动到 api
目录下使用 npm install
安装依赖项:
cd api
npm install
npm
,请确保你已经安装了Node.js,也许选择 nvm
来管理你的Node.js的版本(我使用v6.2.1)。 在你安装了你的依赖项并运行了你的数据库之后,用以下方法启动API。
node app.js
如果你遇到问题,确保你的数据库确实在运行,并且你已经在 api/config.js
文件中输入了你的数据库凭证。
在数据库和Express.js后端运行的情况下,打开一个新的终端标签或窗口,移到项目的 /web
子目录下。安装 bower 和 npm 依赖项,然后通过运行 gulp 来启动应用程序(如果你是第一次使用gulp,请阅读gulpjs.com上的 "入门")。
npm install
bower install
gulp
Action
类型的成员。 点击一部电影可以看到电影的详细页面。
点击一个人,可以看到这个人的相关人物和这个人演过的电影、导演、编剧或制片人。
/api/neo4j/dbUtils.js
处理的,下面逐条描述。 导入依赖关系,包括Neo4j驱动和连接驱动到数据库。
var nconf = require('../config');
var neo4j = require('neo4j-driver').v1;
var driver = neo4j.driver(nconf.get('neo4j-local'), neo4j.auth.basic(nconf.get('USERNAME'), nconf.get('PASSWORD')));
getAll
(如下)提交一个Cypher查询,并将数据库中的结果通过 _manyGenres
函数传递,该函数将结果映射为可用的形式,并处理将Neo4j的整数转换为JavaScript数字的问题。 /api/models/genres.js
var _ = require('lodash');
var Genre = require('../models/neo4j/genre');
var getAll = function(session) {
return session.run('MATCH (genre:Genre) RETURN genre')
.then(_manyGenres);
};
var _manyGenres = function (result) {
return result.records.map(r => new Genre(r.get('genre')));
};
module.exports = {
getAll: getAll
};
/api/models/neo4j/genre.js
// extracts just the data from the query results
var _ = require('lodash');
var Genre = module.exports = function (_node) {
_.extend(this, _node.properties);
if (this.id) {
this.id = this.id.toNumber();
};
};
;
MATCH (genre:Genre) RETURN genre
{ records:
Record {
keys: [ 'genre' ],
length: 1,
_fields: [ Node {
identity: Integer { low: 737, high: 0 },
labels: [ 'Genre' ],
properties: { name: 'Suspense', id: Integer { low: 3270, high: 0 } } ],
_fieldLookup: { genre: 0 } },
... // more records
],
summary:
ResultSummary {
statement: { text: 'MATCH (genre:Genre)\nRETURN genre', parameters: {} },
statementType: 'r',
updateStatistics: StatementStatistics { _stats: [Object] },
plan: false,
profile: false,
notifications: [] } }
genre
节点,我们将使用 record.get('genre')
来获得以下数据。 Node {
identity: Integer { low: 735, high: 0 },
labels: [ 'Genre' ],
properties: { name: 'Family', id: Integer { low: 1258, high: 0 } } }
{
"name": "Family",
"id": 1258
}