ONgDB-APOC自定义函数和过程

  • 定义说明
  • 查看自定义函数和过程
  • 查看构建自定义函数和过程的存储过程
  • 注册一个自定义函数
  • 注册一个自定义过程
  • 输入输出参数支持的数据类型
  • 查看函数和过程清单
  • 删除函数
  • 删除过程
  • 使用案例一
  • 使用案例二
  • 使用案例三
  • 使用案例四
  • 自定义函数与过程存储位置
  • 组件下载

定义说明

APOC提供相关过程来创建用户自定义的函数和过程。这些函数和过程实际上是参数化的Cypher语言查询,类似宏(Macro)的概念。在下面的案例中图库版本为ongdb-3.5.22。
百度概念解释
宏(英语:Macro)是一种批量处理的称谓。
计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。

查看自定义函数和过程

CALL dbms.functions() YIELD name,signature,description,roles WHERE name CONTAINS 'custom' RETURN name,signature,description,roles
UNION
CALL dbms.procedures() YIELD name,signature,description,roles WHERE name CONTAINS 'custom' RETURN name,signature,description,roles

查看构建自定义函数和过程的存储过程

CALL dbms.functions() YIELD name,signature,description,roles WHERE name CONTAINS 'apoc.custom' RETURN name,signature,description,roles
UNION
CALL dbms.procedures() YIELD name,signature,description,roles WHERE name CONTAINS 'apoc.custom' RETURN name,signature,description,roles

注册一个自定义函数

# 输入输出字段及其类型,格式如下:
[ ['item1','type1'],['item2','type2'],…
]
# String::output
# List<List<String>>::inputs
# String::description
apoc.custom.asFunction(name, statement, outputs, inputs, forceSingle, description)
apoc.custom.declareFunction(signature, statement, forceSingle, description)

注册一个自定义过程

  • 支持返回更复杂的数据类型
# 输入输出字段及其类型,格式如下:
[ ['item1','type1'],['item2','type2'],…
]
# List<List<String>>::output
# List<List<String>>::inputs
# String::description
# mode过程支持的模式:/** This procedure will only perform read operations against the graph */READ,/** This procedure may perform both read and write operations against the graph */WRITE,/** This procedure will perform operations against the schema */SCHEMA,/** This procedure will perform system operations - i.e. not against the graph */DBMS,/** This procedure will only perform read operations against the graph */DEFAULT
apoc.custom.asProcedure(name, statement, mode, outputs, inputs, description)
apoc.custom.declareProcedure(signature, statement, mode, description)

输入输出参数支持的数据类型

case "ANY": return NTAny;
case "MAP": return NTMap;
case "NODE": return NTNode;
case "REL": return NTRelationship;
case "RELATIONSHIP": return NTRelationship;
case "EDGE": return NTRelationship;
case "PATH": return NTPath;
case "NUMBER": return NTNumber;
case "LONG": return NTInteger;
case "INT": return NTInteger;
case "INTEGER": return NTInteger;
case "FLOAT": return NTFloat;
case "DOUBLE": return NTFloat;
case "BOOL": return NTBoolean;
case "BOOLEAN": return NTBoolean;
case "DATE": return NTDate;
case "TIME": return NTTime;
case "LOCALTIME": return NTLocalTime;
case "DATETIME": return NTDateTime;
case "LOCALDATETIME": return NTLocalDateTime;
case "DURATION": return NTDuration;
case "POINT": return NTPoint;
case "GEO": return NTGeometry;
case "GEOMETRY": return NTGeometry;
case "STRING": return NTString;
case "TEXT": return NTString;
default: return NTString;

查看函数和过程清单

apoc.custom.list()

删除函数

apoc.custom.removeFunction(name, type)

删除过程

apoc.custom.removeProcedure(name)

使用案例一

  • 自定义函数
CALL apoc.custom.asFunction('double','RETURN $input*2 as answer','long',[['input','number']]
);
RETURN custom.double(12) AS value;
  • 自定义过程
CALL apoc.custom.asProcedure('answer','RETURN $input as answer','read',[['answer','number']],[['input','int','42']])
CALL custom.answer() YIELD answer RETURN answer
CALL custom.answer(13) YIELD answer RETURN answer

使用案例二

  • 函数与过程发布给其它用户需要使用admin构建
  • 基于时间距离长度加总有效持股数
WITH 20160630000000 AS endTime,'深圳市投资控股有限公司' AS name
// 过滤出有效持股数的边并且基于时间距离长度找最近时间的持股关系
// 先过滤出有效持股数holdAmontCalc>0的边,然后基于时间距离长度从边中选举出持股数detail
MATCH (n:HORGShareHoldV002 {name:name})-[r:持股]->(m:HORGShareHoldV002) WHERE ANY(detail IN apoc.convert.fromJsonList(r.shareholding_detail) WHERE detail.holdAmontCalc>0) WITH apoc.convert.fromJsonMap(olab.samplingByDate.dis.jsonArray(olab.convert.json(FILTER(detail IN apoc.convert.fromJsonList(r.shareholding_detail) WHERE detail.holdAmontCalc>0)),'defineDate',endTime)) AS detail
// 加总持股数
RETURN SUM(detail.holdAmontCalc) AS holdTotal
  • 基于时间距离长度加总有效持股数-定义函数
CALL apoc.custom.asFunction('sum.hold','WITH $endTime AS endTime,$name AS name MATCH (n:HORGShareHoldV002 {name:name})-[r:持股]->(m:HORGShareHoldV002) WHERE ANY(detail IN apoc.convert.fromJsonList(r.shareholding_detail) WHERE detail.holdAmontCalc>0) WITH apoc.convert.fromJsonMap(olab.samplingByDate.dis.jsonArray(olab.convert.json(FILTER(detail IN apoc.convert.fromJsonList(r.shareholding_detail) WHERE detail.holdAmontCalc>0)),\'defineDate\',endTime)) AS detail RETURN SUM(detail.holdAmontCalc) AS holdTotal','LONG',[['endTime','LONG'],['name','STRING']],false,'有效持股总数'
);
  • 查看定义的函数
CALL dbms.functions() YIELD name,signature,description,roles WHERE name CONTAINS 'sum.hold' RETURN name,signature,description,roles
  • 使用函数查询有效持股总数
RETURN custom.sum.hold(20160630000000,'深圳市投资控股有限公司')

使用案例三

  • 函数与过程发布给其它用户需要使用admin构建
  • 查询公司基本信息和实控人
// 1、定义公司名称
WITH ['能科股份','科大讯飞','中粮集团有限公司','嘉实基金','武汉当代科技产业集团股份有限公司'] AS nameList
UNWIND nameList AS companyName
// 2、定义GraphQL查询
// # 公司的标准名称name
// # 公司HCODE hcode
// # 标签信息 Tag
// # 来源处代码SrcCompanyCode source # 来源处主表代码-code # 主表名称-table
// legal_person_repr # 法人代表 reg_capital # 注册资本(元) establishment_date # 成立日期 biz_scope # 经营范围 business_major # 主营业务
WITH REPLACE('{\"query\":\"query myConcernedCompany($name: String) { horgByName(name: $name) {name hcode Tag SrcCompanyCode { source code table Hold_Controller { name ratio } } HOrgInfo {legal_person_repr reg_capital establishment_date biz_scope business_major } }}\","variables":{\"name\":\"company-name\"},\"operationName\":\"myConcernedCompany\"}','company-name',companyName) AS query
WITH apoc.convert.fromJsonMap(olab.http.post('http://10.20.13.130/ongdb/graphql',query)) AS result
// 3、获取公司法人、注册资本、成立日期、经营范围信息 并且 获取万得代码和财汇代码
WITH result.data.horgByName[0].hcode AS hcode,result.data.horgByName[0].name AS name,result.data.horgByName[0].Tag AS Tag,result.data.horgByName[0].SrcCompanyCode AS SrcCompanyCode,result.data.horgByName[0].HOrgInfo AS HOrgInfo
// 解析万得和财汇代码 以及 主营业务信息 解析实控人对象
WITH hcode,name,Tag,FILTER(source IN SrcCompanyCode WHERE source.table='TCR0001')[0].code AS ciahuiCode,FILTER(source IN SrcCompanyCode WHERE source.table='CompIntroduction')[0].code AS windCode,HOrgInfo,FILTER(holdCont IN SrcCompanyCode WHERE holdCont.Hold_Controller<>[])[0].Hold_Controller[0] AS holdController
WITH hcode,name,Tag,REPLACE(ciahuiCode,'api','') AS caihuiCode,windCode,HOrgInfo[0].reg_capital AS reg_capital,HOrgInfo[0].legal_person_repr AS legal_person_repr,HOrgInfo[0].business_major AS business_major,HOrgInfo[0].biz_scope AS biz_scope,HOrgInfo[0].establishment_date AS establishment_date,holdController.name AS holdShareController,holdController.ratio AS holdShareControllerRatio
CALL apoc.case([business_major IS NOT NULL,'RETURN $business_major AS scope',biz_scope IS NOT NULL,'RETURN $biz_scope AS scope'],'',{business_major:business_major,biz_scope:biz_scope}) YIELD value
// 经营范围 主体代码 标准名称 标签数组 财汇代码 WIND代码 注册资本 法人 成立日期 实控人 实控人持股比例
RETURN value.scope AS scope ,hcode,name,Tag,caihuiCode,windCode,reg_capital,legal_person_repr,establishment_date,holdShareController,holdShareControllerRatio
  • 使用过程查询公司基本信息和实控人-构建过程
CALL apoc.custom.asProcedure('org.basicinfo','WITH $name AS companyName WITH REPLACE(\'{\\\"query\\\":\\\"query myConcernedCompany($name: String) { horgByName(name: $name) {name hcode Tag SrcCompanyCode { source code table Hold_Controller { name ratio } } HOrgInfo {legal_person_repr reg_capital establishment_date biz_scope business_major } }}\\\","variables":{\\\"name\\\":\\\"company-name\\\"},\\\"operationName\\\":\\\"myConcernedCompany\\\"}\',\'company-name\',companyName) AS query WITH apoc.convert.fromJsonMap(olab.http.post(\'http://10.20.13.130/ongdb/graphql\',query)) AS result WITH result.data.horgByName[0].hcode AS hcode,result.data.horgByName[0].name AS name,result.data.horgByName[0].Tag AS Tag,result.data.horgByName[0].SrcCompanyCode AS SrcCompanyCode,result.data.horgByName[0].HOrgInfo AS HOrgInfo WITH hcode,name,Tag,FILTER(source IN SrcCompanyCode WHERE source.table=\'TCR0001\')[0].code AS ciahuiCode,FILTER(source IN SrcCompanyCode WHERE source.table=\'CompIntroduction\')[0].code AS windCode,HOrgInfo,FILTER(holdCont IN SrcCompanyCode WHERE holdCont.Hold_Controller<>[])[0].Hold_Controller[0] AS holdController WITH hcode,name,Tag,REPLACE(ciahuiCode,\'api\',\'\') AS caihuiCode,windCode,HOrgInfo[0].reg_capital AS reg_capital,HOrgInfo[0].legal_person_repr AS legal_person_repr,HOrgInfo[0].business_major AS business_major,HOrgInfo[0].biz_scope AS biz_scope,HOrgInfo[0].establishment_date AS establishment_date,holdController.name AS holdShareController,holdController.ratio AS holdShareControllerRatio CALL apoc.case([business_major IS NOT NULL,\'RETURN $business_major AS scope\',biz_scope IS NOT NULL,\'RETURN $biz_scope AS scope\'],\'\',{business_major:business_major,biz_scope:biz_scope}) YIELD value RETURN value.scope AS scope ,hcode,name,olab.convert.json(Tag) as Tag,caihuiCode,windCode,reg_capital,legal_person_repr,establishment_date,holdShareController,holdShareControllerRatio','READ',[['scope','STRING'],['hcode','STRING'],['name','STRING'],['Tag','STRING'],['caihuiCode','STRING'],['windCode','STRING'],['reg_capital','STRING'],['legal_person_repr','STRING'],['establishment_date','STRING'],['holdShareController','STRING'],['holdShareControllerRatio','STRING']],[['name','STRING']],'使用过程查询公司基本信息和实控人返回【经营范围 主体代码 标准名称 标签数组 财汇代码 WIND代码 注册资本 法人 成立日期 实控人 实控人持股比例】'
);
  • 查看定义的过程
CALL dbms.procedures() YIELD name,signature,description,roles WHERE name CONTAINS 'org.basicinfo' RETURN name,signature,description,roles
  • 使用过程查询公司基本信息和实控人
WITH ['能科股份','科大讯飞','中粮集团有限公司','嘉实基金','武汉当代科技产业集团股份有限公司'] AS nameList
UNWIND nameList AS companyName
CALL custom.org.basicinfo(companyName) YIELD scope,hcode,name,Tag,caihuiCode,windCode,reg_capital,legal_person_repr,establishment_date,holdShareController,holdShareControllerRatio RETURN scope,hcode,name,apoc.convert.fromJsonList(Tag) AS tag,caihuiCode,windCode,reg_capital,legal_person_repr,establishment_date,holdShareController,holdShareControllerRatio

使用案例四

  • 中文函数名
CALL apoc.custom.asFunction('数字打印函数','RETURN $input*2 as answer','long',[['input','number']]
);
RETURN custom.数字打印函数(12) AS value;
  • 中文过程名
CALL apoc.custom.asProcedure('数字打印过程','RETURN $input as answer','read',[['answer','number']],[['input','int','42']]);
CALL custom.数字打印过程(12) YIELD answer RETURN answer;

自定义函数与过程存储位置

  • 新增属性
apoc.custom
apoc.custom.update

组件下载

  • apoc-3.5.0.15-all
https://github.com/ongdb-contrib/neo4j-apoc-procedures/releases/tag/3.5.0.15.1
  • ongdb-lab-apoc-3.5.22
https://github.com/ongdb-contrib/ongdb-lab-apoc/releases/tag/3.5.22.x
  • ongdb-enterprise-3.5.22
https://github.com/graphfoundation/ongdb/releases/tag/3.5.22

APOC自定义函数和过程相关推荐

  1. js自定义函数及参数问题

    js自定义函数的过程中,往往我们希望指定一些参数的默认值 很容易的会写出如下的js 方法 function test(a,b,c=1,d='id'){ return 1; } 但是定义完之后,浏览器会 ...

  2. Oracle包和包体以及与非包体定义函数、过程的区别

    1.Oracle中的包和包体 Oracle中的包和包体与java中的接口和类才关系特别类似,我们就根据对比学习一下包和包体吧! 2.oracle包和包体与自定义函数,过程区别 2.1 如果直接crea ...

  3. mysql 定一个函数_mysql自定义函数

    mysql中的UDF(自定义函数),其实是个好东西,比如可以写好一些方法或 函数,然后进行调用,而且是在SQL语句中可以进行调用. DROP FUNCTION CalculateAmount CREA ...

  4. oracle 包和包体禁用,Oracle包和包体以及与非包体定义函数、过程的区别

    Oracle包和包体以及与非包体定义函数.过程的区别. 1.Oracle中的包和包体 Oracle中的包和包体与java中的接口和类才关系特别类似,我们就根据对比学习一下包和包体吧! 2.oracle ...

  5. python自定义函数实例计算1-n的偶偶数和_Python入门--11--自定义函数

    使用def定义自定义函数 举个栗子: def myfristFunction(): print "we are 伐木累!" #输入myfristFunction() 会输出:we ...

  6. Excel 2010 VBA 入门 110 获取最小值的自定义函数

    目录 例 码 使用ParamArray关键字声明数组参数 IsMissing函数 IsArray函数 函数的嵌套与递归 ​​​​​​​ 例 在VBA编程过程中,经常会使用工作表函数Min来确立某组数中 ...

  7. 《手把手陪您学Python》26——自定义函数

    在上一篇<手把手陪您学Python>25--列表推导式中,我们学习了推导式的相关概念和使用方法,使用推导式的方法,可以减少代码的输入量.提高可读性,是Python中非常受欢迎的一种形式. ...

  8. 在mysql中创建一个自定义函数来计算两个数的和_Mysql创建自定义函数

    Mysql创建用户自定义函数: >显示库中所有的自定义函数信息: show function status; >创建自定义函数的过程如下demo1: drop function if ex ...

  9. javascript打飞机程序8x8x飞机大战js打飞机程序,飞机大战知识点包含了JavaScript面向过程的全部知识点,包括变量、运算符、判断、循环、数组、自定义函数、系统函数、事件等。...

    js打飞机程序,飞机大战知识点包含了JavaScript面向过程的全部知识点,包括变量.运算符.判断.循环.数组.自定义函数.系统函数.事件等. 讲解了JavaScript编程语言制作游戏界面,添加游 ...

最新文章

  1. ASP.NET Web Pages – 页面布局简介
  2. 安装.Net的痛苦经历!
  3. objective-c 面试题
  4. 1.4 File类(文件操作类)获取文件属性,创建和删除文件\目录,遍历目录
  5. P4513 小白逛公园 (线段树)
  6. boost::recursive_mutex相关的测试程序
  7. 腾讯云主机Python3环境安装PySpider爬虫框架过程
  8. jquery send(data) 对data的处理
  9. 设置公共请求参数_基于分布式锁的防止重复请求解决方案(值得收藏)
  10. IntelliJ IDEA 2018.2.2远程调试Tomcat的配置方法
  11. JavaScript笔记(展开的层)-4
  12. Windows Phone 项目实战之我的微盘
  13. vue安装vue-pdf(预览pdf)
  14. android barchart设置标题,android - 如何设置MPAndroidChart BarChart的高度和宽度? - 堆栈内存溢出...
  15. UGUI 图集打包工具Sprite Packer
  16. Java之HashTab基本用法
  17. 完美解决Win10重命名文件导致资源管理器卡死
  18. C#爬虫 音娱吉他文本和弦谱
  19. 北航计算机学院硕士培养方案,北航硕士研究生培养方案
  20. 恢复计算机到手机桌面,桌面的图标怎么恢复原来的呀?

热门文章

  1. Obsidian自用Markdown语法总集
  2. jena+fuseki+python查询
  3. 微信点餐系统java教程_构建微服务微信点餐系统教程
  4. 记录遇到的问题之---把16进制的颜色rgb转换成‘#’形式
  5. 计算机办公高级试题,高级办公软件之Word测试题
  6. Altium Designer18圆弧走线/铺铜
  7. 2019.9.3 远景智能后台开发一面
  8. 公司百兆局域网千兆升级方案之硬件设备升级(一)
  9. 编译原理代码生成器java_浅入浅出Javac编译原理
  10. Java查找字符串中子串