在AGE的源代码中有哪些必要的更改,以创建与openCypher语法一起使用的函数?

agyaoht7  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(113)

我想在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()
先谢谢你。

nx7onnlm

nx7onnlm1#

reverse()函数已经存在于PR #146之前的AGE代码中,因此可以在age.sql文件中找到它的声明。关于新功能的创建,您是正确的。您需要在age.sql中声明它,并在相关的.c文件中创建一个定义,类似于reverseisEmpty与AGE中的字符串类型的关系。
之所以将函数命名为isEmpty而不是age_isEmpty,是因为Apache AGE中的Cypher查询中的所有函数都在其名称中添加了前缀age_

cgvd09ve

cgvd09ve2#

参考这篇文章。这实现了一个gcd函数,可以从头开始在openCypher语法中使用。
Creating New Function in Apache AGE

xtfmy6hx

xtfmy6hx3#

transform_FuncCall中,所有函数名都以age_为前缀。这就是为什么调用isempty而不是age_isempty仍然有效的原因。

// copy in the prefix - all AGE functions are prefixed with age_ 
 strncpy(ag_name, "age_", 4);

字符串

omtl5h9j

omtl5h9j4#

AGE中创建函数时需要更改的文件包括但不限于:

  • agtype.c中定义函数
  • 添加回归测试
  1. expr.out
  2. expr.sql
  • age--1.3.0.sql中创建

另外,为什么函数被称为isEmpty()而不是age_isempty()?为了回答上述问题,age_isempty()在密码查询之外使用,而isEmpty在密码查询内使用。

相关问题