Neo4j 3.0 存储过程

Neo4j 3.0 提供一个新的功能“存储过程”,该功能并不是Neo4j-Server的扩展,而是可以直接运行的。

在写这篇文章的时候,只能通过预备好的语句去执行

1 CALL package.procedure(params)

但是接下来他会被完全集成到Cypher语句当中。这样我梦就可以通过CALL这个语句或者将它转换成方法表达式(这只是个人喜好)。

现在,“存储过程”只能使用Java(或者其他JVM语言)。你可能获说,“WTF  。。。java”, 其实java也没有那么一无是处。

一开始,在建立,编码,编译一个存储过程并不会花费太多的精力,只需要下载Neo4j 3.0, 3.0.0-M04 milestone或者最新的版本,同时JDK,Gradle或者Maven也需要安装。

我们可以直接使用Jake Hansson写好的一个模板neo4j-examples,这样可以更快的开始我们的第一个练习。

我们举一个简单的例子(GitHub Repository),你需要说明一下org.neo4j:neo4j:3.0.0[-M04]可以得到的取值范围,来获得必需的注释,然后Neo4j API才能讨论数据库。

1 <dependency>
2   <groupId>org.neo4j</groupId>
3   <artifactId>neo4j</artifactId>
4   <version>${neo4j.version}</version>
5   <scope>provided</scope>
6 </dependency>

 

 

Gradle 如下

1 project.ext {
2     neo4j_version = ""
3 }
4 dependencies {
5 compile group: "org.neo4j", name:"neo4j", version:project.neo4j_version
6 testCompile group: "org.neo4j", name:"neo4j-kernel", version:project.neo4j_version, classifier:"tests"
7 testCompile group: "org.neo4j", name:"neo4j-io", version:project.neo4j_version, classifier:"tests"
8 testCompile group: "junit", name:"junit", version:4.12
9 }

 

 

如果你想写一些其他的程序,你只需要重新建立一个文件夹和新的类。

需要注意的是包和方法的名字变成了存储过程的名字(并不是类的名字)。

在我们的例子中,我们将写一个简单的存储过程来计算某个标签的最大和最小度数。

通过@Context标注可以讲Neo4j的 GraphDatabaseService 实例注入到你的类中。因为存储过程是无状态的,所以声明非注入非静态的字段是不允许的。

在我们的例子中,存储过程将命名为stats.degree,以CALL stats.degree('User')的形式进行调用。

01 package stats;
02  
03 public class GraphStatistics {
04  
05     @Context private GraphDatabaseService db;
06  
07     // Result class
08     public static class Degree {
09         public String label;
10         // note, that "int" values are not supported
11         public long count, max, min = Long.MAX_VALUE;
12  
13         // method to consume a degree and compute min, max, count
14         private void add(long degree) {
15           if (degree < min) min = degree;
16           if (degree > max) max = degree;
17           count ++;
18         }
19     }
20  
21     @Procedure
22     public Stream<Degree> degree(String label) {
23         // create holder class for results
24         Degree degree = new Degree(label);
25         // iterate over all nodes with label
26         try (ResourceIterator it = db.findNodes(Label.label(label))) {
27             while (it.hasNext()) {
28                // submit degree to holder for consumption (i.e. max, min, count)
29                d.add(it.next().getDegree());
30             }
31         }
32         // we only return a "Stream" of a single element in this case.
33         return Stream.of(degree);
34     }
35 }

 

 

如果你要快速的测试这个存储过程,又不想启动一个进程内服务端再连接上(比如,存储过程模板中演示的通过新的二进制的通信协议),你可以使用Neo4j测试工具集提供的Java API。

 

现在,我们可以写一个单元测试来测试下我们刚写的酷炫的存储过程。

01 package stats;
02  
03 class GraphStatisticsTest {
04     @Test public void testDegree() {
05         // given Alice knowing Bob and Charlie and Dan knowing no-one
06         db.execute("CREATE (alice:User)-[:KNOWS]->(bob:User),(alice)-[:KNOWS]->(charlie:User),(dan:User)").close();
07  
08         // when retrieving the degree of the User label
09         Result res = db.execute("CALL stats.degree('User')");
10  
11         // then we expect one result-row with min-degree 0 and max-degree 2
12         assertTrue(res.hasNext());
13         Map<String,Object> row = res.next();
14         assertEquals("User", row.get("label"));
15         // Dan has no friends
16         assertEquals(0, row.get("min"));
17         // Alice knows 2 people
18         assertEquals(2, row.get("max"));
19         // We have 4 nodes in our graph
20         assertEquals(4, row.get("count"));
21         // only one result record was produced
22         assertFalse(res.hasNext());
23     }
24 }

 

 

当然,你可以使用存储过程来生成更多的存储过程,比如其他原生支持JVM的语言,比如 JavaScript via Nashorn, Clojure,Groovy, Scala, Frege (Haskell), (J)Ruby or (J/P)ython。

我用JavaScript写了一个生成和运行存储过程的程序。

你还可以用存储过程做很多其他很酷的事情,比如下面列的资源。

如果你有写一些自己的存储过程的想法,请联系我们

其他资源

本文地址:https://www.oschina.net/translate/neo4j-30-stored-procedures

原文地址:https://dzone.com/articles/neo4j-30-stored-procedures

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们

时间: 2024-11-05 20:42:33

Neo4j 3.0 存储过程的相关文章

MySQL5.0存储过程教程_Mysql

希望这本书能像内行专家那样与您进行对话,用简单的问题.例子让你学到需要的知识.为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用例,在学习之前也许大家会认为这个用例很难,但是只要跟着课程去学,相信很快就能掌握. Conventions and Styles 约定和编程风格 每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样. 在这里举个例子:mysql> DROP FUNCTIO

mysql 5.0存储过程学习总结

一.创建存储过程 1.基本语法: create procedure sp_name() begin ......... end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.区块,条件,循环 1.区块定义,常用 begin ......

mysql 5.0存储过程学习

一.创建存储过程 1.基本语法: create procedure sp_name() begin ......... end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.区块,条件,循环 1.区块定义,常用 begin ......

C#调用存储过程详解(带返回值、参数输入输出等)_C#教程

本文实例讲述了C#调用存储过程的方法.分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGIN SELECT @studentname=studentname FROM student WHERE studentid=@studentid if @@Error<>0 RETURN -1 else RETURN 0 E

MySql的存储过程学习小结 附pdf文档下载_Mysql

存储过程是一种存储在数据库库中的程序(就像正规语言里的子程序一样),准确的来说,MySql支持的"routine(例程)"有两种:一是我们说的存储过程,二是在其它sql语句中可以返回值的函数(使用起来和mysql预装载的函数一样,如pi()). 一个存储过程包括名字,参数列表,以及可以包括很多sql语句的sql语句集.在这里对局部变量,异常处理,循环控制和if条件语句有新的语法定义. 下面是一个包括存储过程的实例声明: 复制代码 代码如下: CREATE PROCEDURE proce

MySQL存储过程实例教程

MySQL存储过程实例教程 MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性.高效性.安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的. 实例261:存储过程的创建 这是一个创建存储过程的实例 录像位置:光盘mingrisoft9?lt;/p> 实例说明 为了保证数据的完整性.一致性,提高应用的性能,常采用存储过程技术.MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用.本实例将介

PHP操作MSSQL存储过程修改用户密码

mssql2008 存储过程 下面可以直接远程修改密码.  代码如下 复制代码 USE [GameUserDB] GO IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[dbo].[UpdateUserInfo]') and OBJECTPROPERTY(ID, N'IsProcedure') = 1) DROP PROCEDURE [dbo].[UpdateUserInfo] GO CREATE PROCEDURE

MySQL 创建存储过程

MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b",返回这两个参数的和. drop procedure if exists pr_add; -- 计算两个数之和 create procedure pr_add (    a int,    b int ) begin    declare c int;    if a is null then       set

Mysql 存储过程的学习笔记

技术要点 一个存储过程包括名字.参数列表,以及可以包括很多SQL语句的SQL语句集.下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable)