我想在AGE的源代码中创建一个函数,以便它可以与openCypher语法一起使用。我注意到有一些提交添加了这类函数,比如#710实现了isEmpty()
predicate 函数,还有#146添加了reverse()
函数。这两次提交都更改了agtype.c
文件,在其中添加了函数的定义,并且在age--1.2.0.sql
中添加了isEmpty()
函数的声明,但对于reverse()
函数,则没有(至少在此提交中没有)。isEmpty()
函数的声明:
CREATE FUNCTION ag_catalog.age_isempty(agtype)
RETURNS boolean
LANGUAGE c
IMMUTABLE
RETURNS NULL ON NULL INPUT
PARALLEL SAFE
AS 'MODULE_PATHNAME';
字符串
在agtype.c
中的定义:
PG_FUNCTION_INFO_V1(age_isempty);
/*
* Executor function for isEmpty(property).
*/
Datum age_isempty(PG_FUNCTION_ARGS)
{
// code goes here...
// at the end:
PG_RETURN_BOOL(result == 0);
}
型
虽然函数声明为age_isempty()
,但在cypher_match.sql
中,它被称为isEmpty()
:
SELECT * FROM cypher('for_isEmpty',
$$CREATE (u:for_pred {id:1, type: "empty", list: [], map: {}, string: ""}),
(v:for_pred {id:2, type: "filled", list: [1], map: {a:1}, string: "a"}),
(w:for_pred)$$)
AS (a agtype);
-- Match vertices with empty properties
SELECT * FROM cypher('for_isEmpty',
$$MATCH (u:for_pred) WHERE isEmpty(u.list) RETURN properties(u) $$) -- here.
AS (u agtype);
型
那么,这些文件是唯一需要更改的文件,还是有必要在其他地方更改代码?另外,为什么函数被称为isEmpty()
而不是age_isempty()
?
先谢谢你。
4条答案
按热度按时间nx7onnlm1#
reverse()函数已经存在于PR #146之前的AGE代码中,因此可以在
age.sql
文件中找到它的声明。关于新功能的创建,您是正确的。您需要在age.sql
中声明它,并在相关的.c
文件中创建一个定义,类似于reverse
和isEmpty
与AGE中的字符串类型的关系。之所以将函数命名为
isEmpty
而不是age_isEmpty
,是因为Apache AGE中的Cypher查询中的所有函数都在其名称中添加了前缀age_
。cgvd09ve2#
参考这篇文章。这实现了一个gcd函数,可以从头开始在openCypher语法中使用。
Creating New Function in Apache AGE
xtfmy6hx3#
在
transform_FuncCall
中,所有函数名都以age_
为前缀。这就是为什么调用isempty
而不是age_isempty
仍然有效的原因。字符串
omtl5h9j4#
AGE中创建函数时需要更改的文件包括但不限于:
agtype.c
中定义函数expr.out
个expr.sql
个age--1.3.0.sql
中创建另外,为什么函数被称为isEmpty()而不是age_isempty()?为了回答上述问题,
age_isempty()
在密码查询之外使用,而isEmpty
在密码查询内使用。