使用 Neo4j 和 JavaScript 构建应用程序

Neo4j Javascript 驱动是通过 Javascript 应用程序与 Neo4j 实例交互的官方库。

在 Neo4j 的核心是 Cypher,它是与 Neo4j 数据库交互的查询语言。虽然本指南并不 要求 你必须是经验丰富的 Cypher 查询者,但如果你已经了解一些 Cypher,专注于 Javascript 相关的部分会更容易。你还将在这些页面中得到对 Cypher 的 温和 介绍,但如果这是你第一次接触,请查看 入门 → Cypher,以获得关于图数据库建模和查询的更详细指南。

安装

使用 npm 安装 Neo4j Javascript 驱动

npm i neo4j-driver

连接到数据库

通过创建 Driver 对象并提供 URL 和认证令牌来连接数据库。获取到 Driver 实例后,使用 .getServerInfo() 方法来确保可以建立有效的连接。

var neo4j = require('neo4j-driver');
(async () => {
  // URI examples: 'neo4j://', 'neo4j+s://xxx.databases.neo4j.io'
  const URI = '<database-uri>'
  const USER = '<username>'
  const PASSWORD = '<password>'
  let driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD))
  const serverInfo = await driver.getServerInfo()
  console.log('Connection established')
  console.log(serverInfo)

  // Use the driver to run queries

  await driver.close()
})();

创建示例图

使用 Driver.executeQuery() 方法执行 Cypher 查询。不要硬编码或拼接参数:使用占位符并将参数以键值对的形式指定。

创建两个 Person 节点以及它们之间的 KNOWS 关系
let { records, summary } = await driver.executeQuery(`
  CREATE (a:Person {name: $name})
  CREATE (b:Person {name: $friendName})
  CREATE (a)-[:KNOWS]->(b)
  `,
  { name: 'Alice', friendName: 'David' },
  { database: '<database-name>' }
)
console.log(
  `Created ${summary.counters.updates().nodesCreated} nodes ` +
  `in ${summary.resultAvailableAfter} ms.`
)

查询图

要从数据库检索信息,请使用 Cypher 子句 MATCH

检索所有认识其他人的 Person 节点
let { records, summary } = await driver.executeQuery(`
  MATCH (p:Person)-[:KNOWS]->(:Person)
  RETURN p.name AS name
  `,
  {},
  { database: '<database-name>' }
)

// Loop through users and do something with them
for(let record of records) {
  console.log(`Person with name: ${record.get('name')}`)
  console.log(`Available properties for this node are: ${record.keys}\n`)
}

// Summary information
console.log(
  `The query \`${summary.query.text}\` ` +
  `returned ${records.length} nodes.\n`
)

关闭连接和会话

当完成使用后,调用 .close() 方法关闭 Driver 实例,以释放其仍占用的资源。对任何打开的会话也应如此操作。

const driver = neo4j.driver(URI, neo4j.auth.basic(USER, PASSWORD))
let session = driver.session({ database: '<database-name>' })

// session/driver usage

session.close()
driver.close()

术语表

LTS (长期支持版)

长期支持 (Long Term Support) 版本是保证在若干年内得到支持的版本。Neo4j 4.4 和 5.26 是 LTS 版本。

Aura

Aura 是 Neo4j 的全托管云服务。它提供免费和付费计划。

Cypher

Cypher 是 Neo4j 的图查询语言,允许您从数据库中检索数据。它就像 SQL,但专用于图数据库。

APOC

Awesome Procedures On Cypher (APOC) 是一个包含(许多)函数的库,这些函数在 Cypher 本身中难以轻松实现。

Bolt

Bolt 是用于 Neo4j 实例和驱动程序之间交互的协议。默认监听 7687 端口。

ACID

原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性 (Durability) (ACID) 是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保即使发生故障,数据库中的数据也能保持准确和一致。

最终一致性

如果一个数据库能保证所有集群成员在某个时间点都存储了数据的最新版本,则该数据库具有最终一致性。

因果一致性

如果读写查询被集群中的每个成员以相同的顺序看到,则数据库具有因果一致性。这比最终一致性更强。

NULL

空标记不是一种类型,而是缺失值的占位符。更多信息,请参阅 Cypher → 使用 null

事务

事务是一个工作单元,要么被提交,要么在失败时被回滚。例如银行转账:它涉及多个步骤,但它们必须全部成功或全部撤销,以避免钱从一个账户扣除却未存入另一个账户的情况。

背压

背压是对数据流的抵抗力。它确保客户端不会被过快发送的数据压垮,从而超出其处理能力。

书签

书签是代表数据库某种状态的标记。通过将一个或多个书签与查询一起传递,服务器将确保在所表示的状态建立之前,该查询不会被执行。

事务函数

事务函数是由 executeReadexecuteWrite 调用执行的回调。如果发生服务器故障,驱动程序会自动重新执行该回调。

驱动程序 (Driver)

Driver 对象保存了与 Neo4j 数据库建立连接所需的详细信息。