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写了一个生成和运行存储过程的程序。

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

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

其他资源

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

Neo4j 3.0 存储过程的更多相关文章

  1. 第一款支持容器和云部署的开源数据库Neo4j 3.0

    导读 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计:提供给开发者更强大的生产力:提供更广阔的部署选择.Neo4j 3.0 被认为是世界 ...

  2. 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构

    基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生 ...

  3. mysql 5.0存储过程学习总结

    mysql存储过程的创建,删除,调用及其他常用命令 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.q ...

  4. Neo4j 2.0 M4 发布

    Neo4j 发布了 2.0 的第四个里程碑版本,该版本要求 Java 7 的支持.详细的改进记录请看发行通知. Neo是一个网络——面向网络的数据库——也就是说,它是一个嵌入式的.基于磁盘的.具备完全 ...

  5. EF切EFCore2.0存储过程问题

    在从EF切换成EFCore2.0的过程中,遇到了存储过程的实现问题. 在EF中调用存储过程,非常方便,能够直接将结果转换成对应的结果类. 如代码中的Database.SqlQuery<TElem ...

  6. Neo4j 2.0 生产环境集群搭建

    一.在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,10.230.9.93. 10.230.9 ...

  7. MySQL5.0存储过程教程

    Introduction 简介 MySQL 5.0 新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的.简单的来说是介绍了“存储过程.触发器.视图.信息架构视图”,在此感谢译者陈朋奕的努力 ...

  8. neo4j开发自定义存储过程注意事项

    开发自定义的neo4j存储过程(procedures)注意事项及说明: 1.调用方式: 在neo4j的web界面(http://localhost:7474/)命令行输入框内,输入call your_ ...

  9. neo4j APOC与自定义存储过程环境搭建

    neo4j APOC与自定义存储过程环境搭建 主要参考资料:APOC官网https://neo4j-contrib.github.io/neo4j-apoc-procedures/APOC介绍 PPT ...

随机推荐

  1. YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)

    程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...

  2. hibernate的HQL语句

    1.in的用法 obj.goods_return_status in (:ids) 然后在给ids赋值

  3. C#datagridview 防止闪烁的方法

    描述:拉动DataGridView滚动条时会出现闪烁,看起来像是在重画,感觉不是很好. 解决方式:采用双缓存机制,在方案中添加方法. 代码: public static class Extension ...

  4. php中CURL实现模拟登录并采集数据

    在php中采集我们用的是简单的采集方式(例如file_get_contents)就无法做到了,但是如果想模拟登录用户并采集利用它就没办法了,我们可利用CURL函数来实现模拟登录并采集数据 这里要说一些 ...

  5. [LeetCode_5] Longest Palindromic Substring

    LeetCode: 5. Longest Palindromic Substring class Solution { public: //动态规划算法 string longestPalindrom ...

  6. [转]VB Winsock 控件TCP与UDP连接实例

    [-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法   利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...

  7. Python,Jupyter Notebook,IPython快速安装教程

    0.安装环境 Windows10,Python3.5.1,IPython,jupyter notebook,and other functionality 官方安装文档Linux版3.x 官方安装文档 ...

  8. iOS Library not loaded: Reason: image not found

    iOS Library not loaded: ReactiveCocoa.framework ...Reason: image not found 解决办法:BuildPhases中,将对应的框架的 ...

  9. SQL-Server使用点滴(三)

    除了基本的数据库,数据表,数据记录操作之外,SQL-Server还为我们提供了比较丰富的其他对象元素.函数,过程,触发器,序列,映射服务器, 以及对各种元素的系统表信息读取与判断. --先加一个利用递 ...

  10. Tomcat内部结构及工作原理学习

    Tomcat原本是Servlet/JSP的一个调试工具,后来才发展为一个Servlet/JSP的容器. Tomcat作为Servlet容器,负责处理客户请求,把请求传送给Servlet并把结果返回给客 ...