neo4j提供了丰富而强大的函数,可通过CALL dbms.procedures()查询

在一些复杂的应用场景中,neo4j自带的各种函数不能满足需求的时候,我们可以通过自定义函数去扩展和提升Neo4j的一些常用命令功能。


自定义函数的结果输出类型具体包括以下类型:

• java.lang.Boolean or boolean
• java.lang.Double or double
• java.lang.Long or long
• java.lang.Number
• java.lang.Object
• java.lang.String or string
• java.util.List
• java.util.Map
• org.neo4j.graphdb.Node
• org.neo4j.graphdb.Relationship
• org.neo4j.graphdb.Path
• org.neo4j.graphdb.spatial.Geometry
• org.neo4j.graphdb.spatial.Point
• Map<String, Object>
• List

如果输出结果类型在以上这些之外,则会报错:

org.neo4j.server.ServerStartupException: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@64f1fd08' was successfully initialized, but failed to start. Please see the attached cause exception "Argument `i` at position 0 in `add` with
type `int` cannot be converted to a Neo4j type: Don't know how to map `int` to the Neo4j Type System.
Please refer to to the documentation for full details.
For your reference, known types are: [boolean, byte[], double, java.lang.Boolean, java.lang.Double, java.lang.Long, java.lang.Number, java.lang.Object, java.lang.String, java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime, java.time.OffsetTime, java.time.ZonedDateTime, java.time.temporal.TemporalAmount, java.util.List, java.util.Map, long, org.neo4j.graphdb.Node, org.neo4j.graphdb.Path, org.neo4j.graphdb.Relationship, org.neo4j.graphdb.spatial.Geometry, org.neo4j.graphdb.spatial.Point]".at org.neo4j.server.exception.ServerStartupErrors.translateToServerStartupError(ServerStartupErrors.java:68)at org.neo4j.server.AbstractNeoServer.start(AbstractNeoServer.java:220)at org.neo4j.harness.internal.InProcessServerControls.start(InProcessServerControls.java:78)at org.neo4j.harness.internal.AbstractInProcessServerBuilder.newServer(AbstractInProcessServerBuilder.java:155)at org.neo4j.harness.junit.Neo4jRule$1.evaluate(Neo4jRule.java:75)at org.junit.rules.RunRules.evaluate(RunRules.java:20)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

代码实现:

jar包依赖:

 <properties><neo4j.version>3.4.9</neo4j.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.neo4j</groupId><artifactId>neo4j</artifactId><version>${neo4j.version}</version><scope>provided</scope></dependency><dependency><groupId>org.neo4j.test</groupId><artifactId>neo4j-harness</artifactId><version>${neo4j.version}</version><scope>test</scope></dependency><dependency><groupId>org.neo4j.driver</groupId><artifactId>neo4j-java-driver</artifactId><version>1.4.2</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><!-- Neo4j Procedures require Java 8 --><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-shade-plugin</artifactId><version>2.4.3</version></plugin></plugins></build>

自定义函数:

package com.zhbr.neo4j;import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.procedure.Description;
import org.neo4j.procedure.Name;
import org.neo4j.procedure.UserFunction;import java.util.*;public class UserFunctions {@UserFunction("my.hello")@Description("问候")public String hello(@Name("name") String name) {return "Hello "+name;}@UserFunction("my.add")@Description("加法")public double add(@Name("i") double i,@Name("y") double y) {return i+y;}@UserFunction("my.compare")@Description("比较两个节点的属性是否相同")public Boolean compare(@Name("node1") Node i, @Name("node2") Node y) {String i_ywxtmc = (String) i.getProperty("ywxtmc");String y_ywxtmc = (String) y.getProperty("ywxtmc");if (i_ywxtmc.equals(y_ywxtmc)){return true;}return false;}@UserFunction("my.recommendation")@Description("写的乱七八糟的推荐算法")public String recommendation(@Name("node") Node node){ArrayList<Integer> maxCount = new ArrayList<>();ArrayList<String> moviesBox = new ArrayList<>();Iterable<Relationship> relationships = node.getRelationships();for (Relationship relationship : relationships){Node nodes = relationship.getEndNode();String likeMovies = (String) nodes.getProperty("name");moviesBox.add(likeMovies);}Map<String, Integer> listElements = frequencyOfListElements(moviesBox);for (Map.Entry<String, Integer> entry : listElements.entrySet()){int value = entry.getValue().intValue();maxCount.add(value);}Integer max = Collections.max(maxCount);String key = getKey(listElements, max);return key;}/*** java统计List集合中每个元素出现的次数* 例如frequencyOfListElements(["111","111","222"])*  ->* 则返回Map {"111"=2,"222"=1}* @param items* @return  Map<String,Integer>* @author wuqx*/public Map<String,Integer> frequencyOfListElements(List<String> items ) {if (items == null || items.size() == 0) return null;Map<String, Integer> map = new HashMap<String, Integer>();for (String temp : items) {Integer count = map.get(temp);map.put(temp, (count == null) ? 1 : count + 1);}return map;}/*** 根据value找key* @param map* @param value* @return*/private String getKey(Map<String, Integer> map, Object value) {String key = "";for (Map.Entry<String, Integer> entry : map.entrySet()) {if (value.equals(entry.getValue())) {key = entry.getKey();continue;}}return key;}
}

代码测试:

package com.zhbr.neo4j;import org.junit.Rule;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.harness.junit.Neo4jRule;public class UserFunctionTest {@Rulepublic Neo4jRule neo4j = new Neo4jRule().withFunction(UserFunctions.class);@Testpublic void testGreeting() {GraphDatabaseService db = neo4j.getGraphDatabaseService();Result result = db.execute("return my.hello('world') as res");System.out.println(result.next().get("res").toString());Result result1 = db.execute("return my.add(1,2) as res");System.out.println(result1.next().get("res").toString());}
}

将jar包添加到neo4j

maven package后会在target目录下生成jar包,将jar包放到neo4j项目的plugin目录下,重启neo4j即可

测试



本文参考:

https://blog.csdn.net/yuanyk1222/article/details/94558980

Neo4j 自定义函数相关推荐

  1. 2021年大数据Hive(八):Hive自定义函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive自定义函数 一.概述 1.UDF(User-Define ...

  2. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  3. 自定义函数_自定义函数,让你的表格为所欲为

    自定义函数可以做什么?可以让你的表格为所欲为! 这篇文章教你如何掌握自定义函数. 函数是大家在使用 Excel 工作的过程中经常会用到的. 比如大家已经很熟悉了的求和函数 SUM,计数函数 COUNT ...

  4. 【mysql的编程专题⑤】自定义函数

    用户自定义函数(user-defined function,UDF) 是一种对mysql的扩展途径,其用法与内置函数相同 创建自定义函数 语法 create function function_nam ...

  5. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  6. 查缺补漏 | Python自定义函数

    1 默认参数要放在自定义函数参数列表的最后,也就是说下面的定义是不允许的 2 调用函数时熟悉的是位置参数,但是也可以用关键字参数,也就是调用时把参数名写出来(可以通过它来改变参数的顺序).不过貌似系统 ...

  7. 实验 4 在分支循环结构中调用自定义函数

    1.利用循环计算多个圆柱体体积. 要求: 1. 当输入的半径r或h<=0时,提示输入错误,重新输入: 2. r和h为整形: 3. 利用变量n代表多少个圆柱需要计算,n由键盘输入: 4. 连续计算 ...

  8. 关于学习Python的一点学习总结(26->自定义函数及创建初始化数据结构函数)

    62.自定义函数: 1.判断某个对象是否可调用,使用内置函数callable >>> import math>>> x=1>>> y=math.s ...

  9. MySQL-自定义函数

    函数体由合法的SQL语句构成: 可以是简单的select或者insert语句 如果是复合结构,则使用begin--end语句: 复合结构可以包含声明,循环,控制结构: 创建自定义函数: CREATE ...

最新文章

  1. JAVA一个项目的路径为_java 得到项目路径
  2. python简单代码hello-[代码全屏查看]-python初学之helloworld
  3. vim E492: Not an editor command: ^M
  4. 进度条设置_朋友圈可以设置quot;仅一个月可见quot;了,什么时候出语音进度条呢?内附陈粒小姐姐的新歌哦~...
  5. 传送带(洛谷-P2571)
  6. html设置功能区菜单,html – 具有“3D”效果的功能区
  7. 集合拆成固定长度的小集合_《集合啦动物森友会》钓鱼怎么玩?钓鱼小技巧攻略分享...
  8. mysql同时往两个表插数据_MySQL 的两个特殊数据类型属性 unsigned与 zerofill
  9. php注册树模式,PHP设计模式之注册树模式
  10. 2018青岛大学计算机考研真题,2018年青岛大学师范学院880数学基础综合[专业硕士]之数学分析考研基础五套测试题...
  11. tomcat .appcache html5离线缓存,html5 application cache遇到的严重问题
  12. bootstrapmodel确认操作框_Bootstrap使用模态框modal实现表单提交弹出框
  13. 尽量干净地卸载360
  14. 复现IIS PUT任意上传漏洞(过程,步骤,说明)
  15. 计算机应用 winxp,XP平台:计算机应用基础
  16. 爬虫爬取文件(图片,视频)
  17. C#邮件过滤系统(论文+可执行程序+源码+外文翻译+程序操作演示录像)
  18. 中国物流市场趋势报告、技术动态创新及市场预测
  19. android短信删除,Android删除短信的方法
  20. 极客日报:腾讯《王者荣耀》禁止未满12周岁用户充值;B站发布16款新品游戏;华为注册姚安娜商标被驳回

热门文章

  1. 美团面试之Hr面,不会套路把我坑惨了......
  2. (限时删)199买的 Excel表格 实操大全,0.01送粉丝!
  3. dSploit使用教程——强大的Android网络***软件!
  4. Unity 2d 有关陷阱的制作
  5. Entrez ID 和 gene symbol 和 Ensembl ID转换
  6. 数据结构:单链表逆置
  7. 【源码】基于SIMULINK的LEGO Mindstorms EV3 BallBot机器人
  8. mobi怎么在Mac电脑上打开?
  9. mouseover与mouseenter,mouseout和mouseleave的区别
  10. C#自定义控件VS用户控件