入门
关于官方驱动程序
Neo4j 为多种流行的编程语言提供官方驱动程序。这些驱动程序受 Neo4j 支持。
许多语言也存在社区驱动程序,但其功能集、成熟度和支持方面差异很大。要了解有关社区驱动程序的更多信息,请访问 https://neo4j.ac.cn/developer/language-guides/。
以下语言和框架受 Neo4j 官方支持
语言/框架 | 支持的版本 |
---|---|
.NET |
|
Go |
Go 1.10 |
Java |
Java 8+(最新补丁版本)。 |
JavaScript |
所有 Node.JS 的 LTS 版本,特别是 4.x 和 6.x 系列运行时 (https://github.com/nodejs/LTS)。 |
Python |
CPython 3.5 及更高版本。 |
驱动程序 API 旨在与拓扑无关。这意味着底层数据库拓扑(单个实例、因果集群等)可以在无需对应用程序代码进行相应更改的情况下进行更改。在一般情况下,当对拓扑进行更改时,只需要修改 连接 URI。
官方驱动程序不支持 HTTP 通信。如果您需要 HTTP 驱动程序,请选择一个社区驱动程序。另请参阅 HTTP API 文档。 |
驱动程序版本和安装
从 **Neo4j 4.0** 开始,**数据库、驱动程序和协议的版本控制方案已全部对齐**。这简化了一般兼容性问题。
跨版本兼容性仍然可用,并且保证了服务器和驱动程序之间当前版本和先前版本之间的最低支持。更具体地说,这意味着 **Neo4j 4.0** 保证与 **4.0 驱动程序** 和 **1.7 驱动程序** 兼容,并且 **4.0 驱动程序** 保证与 **Neo4j 4.0** 和 **Neo4j 3.5** 兼容。在至少一个对等节点低于版本 4.0 的情况下,通信将以 **回退模式** 进行,将功能限制在最低版本组件中可用的功能。
1.7 版驱动程序不支持 Neo4j 4.0 中引入的多个数据库和 Neo4j Fabric 功能。要能够同时在线运行多个数据库并在其上执行分布式查询,您必须将驱动程序从 1.7 升级到 4.0。有关信息,请参阅 升级和迁移指南→驱动程序更改。 |
在可能的情况下,建议使用最新的稳定驱动程序版本。这将提供最大程度的稳定性,并确保可以使用服务器的全部功能。驱动程序与 **Neo4j 企业版** 一起使用时,具有完整的集群路由支持。但是,驱动程序不会在 **企业版** 和 **社区版** 之间进行明确区分,而只是使用 **Neo4j** 本身提供的功能进行操作。
要安装驱动程序或了解有关哪些驱动程序版本可用的更多信息,请使用下面描述的相关语言分发系统。
.NET 驱动程序通过 NuGet 库分发。要查找驱动程序的最新版本,请访问 https://nuget.net.cn/packages/Neo4j.Driver/。
依赖项
-
.NETStandard (^2.0)
-
System.Net.NameResolution (^4.3.0)
-
System.Net.Security (^4.3.2)
-
System.Net.Sockets (^4.3.0)
-
System.Runtime.InteropServices.RuntimeInformation (^4.3.0)
-
System.Runtime.Serialization.Primitives (^4.3.0)
-
System.Threading.Thread (^4.3.0)
-
System.ValueTuple (^4.5.0)
.NET 反应式 API 位于包 Neo4j.Driver.Reactive
下。它构建在 System.Reactive
之上。使用 .NET 反应式 API 不需要额外的依赖项。
要在 Visual Studio 中使用 NuGet 安装驱动程序的最新版本
PM> Install-Package Neo4j.Driver
也可以选择安装特定版本的驱动程序。
PM> Install-Package Neo4j.Driver -Version $DOTNET_DRIVER_VERSION
.Net 驱动程序默认使用异步方法。如果要使用阻塞调用,则 Neo4j.Driver.Simple
NuGet 包包含一组扩展。这可以在 https://nuget.net.cn/packages/Neo4j.Driver.Simple/ 中找到。初始示例使用了这些扩展。
在以下示例中,我们安装了驱动程序版本 4.1.1。
PM> Install-Package Neo4j.Driver -Version 4.1.1
此驱动程序的发行说明可在 此处 获取。
要查找驱动程序的最新版本,请访问 https://github.com/neo4j/neo4j-go-driver/releases
要使用 go get
安装驱动程序的最新版本
go get github.com/neo4j/neo4j-go-driver/v4@<latest tag>
请注意,这需要启用 Go 模块。
要使用 Java 驱动程序,建议使用依赖项管理器,例如 Maven 或 Gradle。要查找驱动程序的最新版本,请访问 Maven 中央存储库。
依赖项
-
org.reactivestreams:reactive-streams
-
org.apache.logging.log4j:log4j(可选)
驱动程序依赖于 Reactive Streams API,从而保持 JDK 8 兼容性。为了充分利用反应式 API,我们建议使用 Project Reactor 或 RxJava2 等附加框架。两者都实现了 Reactive Streams API 并提供了一套完整的运算符。
使用 Maven 时,请将以下块添加到 pom.xml 文件中。驱动程序版本可以声明为属性(如第一个示例所示)或显式版本号(如第二个示例所示)。
<dependencies>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>$JAVA_DRIVER_VERSION</version>
</dependency>
</dependencies>
在以下示例中,添加了驱动程序版本 4.1.4。
<dependencies>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>4.1.4</version>
</dependency>
</dependencies>
对于 Gradle,需要一条编译行。同样,这可以使用属性或显式版本号。
compile 'org.neo4j.driver:neo4j-java-driver:$JAVA_DRIVER_VERSION'
在以下示例中,添加了驱动程序版本 4.1.4。
compile 'org.neo4j.driver:neo4j-java-driver:4.1.4'
此驱动程序的发行说明可在 此处 获取。
要使用 JavaScript 驱动程序,建议使用 npm
。要查找驱动程序的最新版本,请使用
npm show neo4j-driver@* version
依赖项
-
Babel/Runtime (^7.5.5)
-
RxJS (^6.5.2)
-
text-encoding-utf-8 (^1.0.2)
-
URI-js (^4.2.2)
JavaScript 反应式 API 通过 RxJs 构建和公开。RxJs 的依赖项会随驱动程序自动安装。
要安装驱动程序的最新版本
npm install neo4j-driver
也可以选择安装特定版本的驱动程序。
npm install neo4j-driver@$JAVASCRIPT-DRIVER-VERSION
在以下示例中,安装了驱动程序版本 4.1.2。
npm install neo4j-driver@4.1.2
此驱动程序的发行说明可在 此处 获取。
要查找 Python 驱动程序的最新稳定版本,请访问 https://pypi.ac.cn/project/neo4j/
要查找所有可用版本的列表,请访问 https://pypi.ac.cn/simple/neo4j/
安装 Python 驱动程序的最新稳定版本
pip install neo4j
也可以选择安装特定版本的驱动程序。
以下是安装特定版本的 Python 驱动程序的语法
pip install neo4j==$PYTHON_DRIVER_VERSION
在以下示例中,我们安装的是 Python 驱动程序 4.1 版本。
pip install neo4j==4.1
在以下示例中,我们获取最新的预发布版本
pip install neo4 --pre
Python 驱动程序的发行说明可在 此处 获取
"Hello World" 示例
以下示例显示了通过驱动程序与Neo4j交互所需的最小配置。
public class HelloWorldExample : IDisposable
{
private readonly IDriver _driver;
public HelloWorldExample(string uri, string user, string password)
{
_driver = GraphDatabase.Driver(uri, AuthTokens.Basic(user, password));
}
public void PrintGreeting(string message)
{
using (var session = _driver.Session())
{
var greeting = session.WriteTransaction(tx =>
{
var result = tx.Run("CREATE (a:Greeting) " +
"SET a.message = $message " +
"RETURN a.message + ', from node ' + id(a)",
new {message});
return result.Single()[0].As<string>();
});
Console.WriteLine(greeting);
}
}
public void Dispose()
{
_driver?.Dispose();
}
public static void Main()
{
using (var greeter = new HelloWorldExample("bolt://localhost:7687", "neo4j", "password"))
{
greeter.PrintGreeting("hello, world");
}
}
}
func helloWorld(uri, username, password string) (string, error) {
driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ""))
if err != nil {
return "", err
}
defer driver.Close()
session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite})
defer session.Close()
greeting, err := session.WriteTransaction(func(transaction neo4j.Transaction) (interface{}, error) {
result, err := transaction.Run(
"CREATE (a:Greeting) SET a.message = $message RETURN a.message + ', from node ' + id(a)",
map[string]interface{}{"message": "hello, world"})
if err != nil {
return nil, err
}
if result.Next() {
return result.Record().Values[0], nil
}
return nil, result.Err()
})
if err != nil {
return "", err
}
return greeting.(string), nil
}
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
import org.neo4j.driver.Result;
import org.neo4j.driver.Transaction;
import org.neo4j.driver.TransactionWork;
import static org.neo4j.driver.Values.parameters;
public class HelloWorldExample implements AutoCloseable
{
private final Driver driver;
public HelloWorldExample( String uri, String user, String password )
{
driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) );
}
@Override
public void close() throws Exception
{
driver.close();
}
public void printGreeting( final String message )
{
try ( Session session = driver.session() )
{
String greeting = session.writeTransaction( new TransactionWork<String>()
{
@Override
public String execute( Transaction tx )
{
Result result = tx.run( "CREATE (a:Greeting) " +
"SET a.message = $message " +
"RETURN a.message + ', from node ' + id(a)",
parameters( "message", message ) );
return result.single().get( 0 ).asString();
}
} );
System.out.println( greeting );
}
}
public static void main( String... args ) throws Exception
{
try ( HelloWorldExample greeter = new HelloWorldExample( "bolt://localhost:7687", "neo4j", "password" ) )
{
greeter.printGreeting( "hello, world" );
}
}
}
const driver = neo4j.driver(uri, neo4j.auth.basic(user, password))
const session = driver.session()
try {
const result = await session.writeTransaction(tx =>
tx.run(
'CREATE (a:Greeting) SET a.message = $message RETURN a.message + ", from node " + id(a)',
{ message: 'hello, world' }
)
)
const singleRecord = result.records[0]
const greeting = singleRecord.get(0)
console.log(greeting)
} finally {
await session.close()
}
// on application exit:
await driver.close()
from neo4j import GraphDatabase
import logging
from neo4j.exceptions import ServiceUnavailable
class App:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
# Don't forget to close the driver connection when you are finished with it
self.driver.close()
def create_friendship(self, person1_name, person2_name):
with self.driver.session() as session:
# Write transactions allow the driver to handle retries and transient errors
result = session.write_transaction(
self._create_and_return_friendship, person1_name, person2_name)
for row in result:
print("Created friendship between: {p1}, {p2}".format(p1=row['p1'], p2=row['p2']))
@staticmethod
def _create_and_return_friendship(tx, person1_name, person2_name):
# To learn more about the Cypher syntax, see https://neo4j.ac.cn/docs/cypher-manual/current/
# The Reference Card is also a good resource for keywords https://neo4j.ac.cn/docs/cypher-refcard/current/
query = (
"CREATE (p1:Person { name: $person1_name }) "
"CREATE (p2:Person { name: $person2_name }) "
"CREATE (p1)-[:KNOWS]->(p2) "
"RETURN p1, p2"
)
result = tx.run(query, person1_name=person1_name, person2_name=person2_name)
try:
return [{"p1": row["p1"]["name"], "p2": row["p2"]["name"]}
for row in result]
# Capture any errors along with the query and data for traceability
except ServiceUnavailable as exception:
logging.error("{query} raised an error: \n {exception}".format(
query=query, exception=exception))
raise
def find_person(self, person_name):
with self.driver.session() as session:
result = session.read_transaction(self._find_and_return_person, person_name)
for row in result:
print("Found person: {row}".format(row=row))
@staticmethod
def _find_and_return_person(tx, person_name):
query = (
"MATCH (p:Person) "
"WHERE p.name = $person_name "
"RETURN p.name AS name"
)
result = tx.run(query, person_name=person_name)
return [row["name"] for row in result]
if __name__ == "__main__":
# Aura queries use an encrypted connection using the "neo4j+s" URI scheme
bolt_url = "%%BOLT_URL_PLACEHOLDER%%"
user = "<Username for Neo4j Aura database>"
password = "<Password for Neo4j Aura database>"
app = App(bolt_url, user, password)
app.create_friendship("Alice", "David")
app.find_person("Alice")
app.close()