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才能讨论数据库。
2 |
<groupId>org.neo4j</groupId> |
3 |
<artifactId>neo4j</artifactId> |
4 |
<version>${neo4j.version}</version> |
5 |
<scope>provided</scope> |
Gradle 如下
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 |
如果你想写一些其他的程序,你只需要重新建立一个文件夹和新的类。
需要注意的是包和方法的名字变成了存储过程的名字(并不是类的名字)。
在我们的例子中,我们将写一个简单的存储过程来计算某个标签的最大和最小度数。
通过@Context标注可以讲Neo4j的 GraphDatabaseService 实例注入到你的类中。因为存储过程是无状态的,所以声明非注入非静态的字段是不允许的。
在我们的例子中,存储过程将命名为stats.degree,以CALL stats.degree('User')的形式进行调用。
03 |
public class GraphStatistics { |
05 |
@Context private GraphDatabaseService db; |
08 |
public static class Degree { |
10 |
// note, that "int" values are not supported |
11 |
public long count, max, min = Long.MAX_VALUE; |
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; |
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()); |
32 |
// we only return a "Stream" of a single element in this case. |
33 |
return Stream.of(degree); |
如果你要快速的测试这个存储过程,又不想启动一个进程内服务端再连接上(比如,存储过程模板中演示的通过新的二进制的通信协议),你可以使用Neo4j测试工具集提供的Java API。
现在,我们可以写一个单元测试来测试下我们刚写的酷炫的存储过程。
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(); |
08 |
// when retrieving the degree of the User label |
09 |
Result res = db.execute("CALL stats.degree('User')"); |
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")); |
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()); |
当然,你可以使用存储过程来生成更多的存储过程,比如其他原生支持JVM的语言,比如 JavaScript via Nashorn, Clojure,Groovy, Scala, Frege (Haskell), (J)Ruby or (J/P)ython。
我用JavaScript写了一个生成和运行存储过程的程序。
你还可以用存储过程做很多其他很酷的事情,比如下面列的资源。
如果你有写一些自己的存储过程的想法,请联系我们。
其他资源
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照
CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
- 第一款支持容器和云部署的开源数据库Neo4j 3.0
导读 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计:提供给开发者更强大的生产力:提供更广阔的部署选择.Neo4j 3.0 被认为是世界 ...
- 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构
基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生 ...
- mysql 5.0存储过程学习总结
mysql存储过程的创建,删除,调用及其他常用命令 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.q ...
- Neo4j 2.0 M4 发布
Neo4j 发布了 2.0 的第四个里程碑版本,该版本要求 Java 7 的支持.详细的改进记录请看发行通知. Neo是一个网络——面向网络的数据库——也就是说,它是一个嵌入式的.基于磁盘的.具备完全 ...
- EF切EFCore2.0存储过程问题
在从EF切换成EFCore2.0的过程中,遇到了存储过程的实现问题. 在EF中调用存储过程,非常方便,能够直接将结果转换成对应的结果类. 如代码中的Database.SqlQuery<TElem ...
- Neo4j 2.0 生产环境集群搭建
一.在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,10.230.9.93. 10.230.9 ...
- MySQL5.0存储过程教程
Introduction 简介 MySQL 5.0 新特性教程是为需要了解5.0版本新特性的MySQL老用户而写的.简单的来说是介绍了“存储过程.触发器.视图.信息架构视图”,在此感谢译者陈朋奕的努力 ...
- neo4j开发自定义存储过程注意事项
开发自定义的neo4j存储过程(procedures)注意事项及说明: 1.调用方式: 在neo4j的web界面(http://localhost:7474/)命令行输入框内,输入call your_ ...
- neo4j APOC与自定义存储过程环境搭建
neo4j APOC与自定义存储过程环境搭建 主要参考资料:APOC官网https://neo4j-contrib.github.io/neo4j-apoc-procedures/APOC介绍 PPT ...
随机推荐
- Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, ...
- 【笔记】科普createDocumentFragment() 创建文档碎片节点
上一篇文章说到了动态添加文本节点的方法那如果我们要添加多个文本节点或者元素节点呢? 大家可能会想到用循环然后逐个逐个添加 但是别忘了js 还提供了创建一个文本碎片的方法 createDocumentF ...
- 在Ubuntu14.04_ROS_indigo上安装Kinect2驱动和bridge
小乌龟:大乌龟,你这两周干么呢? 大乌龟:在Ubuntu14.04 ROS_indigo上装Kinect2的驱动和bridge 小乌龟:就装个驱动有什么难的 大乌龟:你说的对小乌龟,这确实不是问题,但 ...
- python 查找指定内容的txt文件
程序设计思路:1. 利用os.walk()找出所有的文件;2.利用正则找到指定后缀的文件:3.找到需要的txt文件后,通过open().readlines()读取文件中每行数据;4.读取后,保存正则匹 ...
- 利用 async & await 的异步编程
走进异步编程的世界 - 开始接触 async/await 利用 async & await 的异步编程 async 的三大返回类型 公司技术需求备忘录
- 关于iBatis.NET连接各数据库时提示没找到数据库驱动的依赖文件
iBatis.net在连接oracle数据库时使用的是:oracleClient1.0 这个是系统自带的驱动,配置上即可,使用的连接配置为: <database> <provider ...
- Hibernate 基础配置及常用功能(一)
本来是想等全部框架测试完以后再统一发布的,但是随着测试的一点点增加感觉把需要叙述的东西放在一起终将会是一场灾难.所以还是打算分成几章来描述,其中还包括一些有待解决的问题.短期很难腾出时间来仔细阅读Hi ...
- MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction
一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...
- iOS中什么是superView?(新手概念简述版)
文/司马陶冶(简书作者)/文章有删改原文链接:http://www.jianshu.com/p/8537dac37852 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在iPhone ...
- ssh 配置config 别名
打开shell 当前用户 cd ~ cd .ssh vim config Host (别名) User root(git) 登陆远程shell的用户 HostName 10.0.0.1 ip地址 ...