如何使用Cypher语言创建带有多个参数的PostgreSQL用户定义函数?[关闭]

brccelvz  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(2)|浏览(151)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

昨天关门了。
Improve this question
我想创建一个PostgreSQL用户定义的函数,它接受多个参数,并且可以使用我的命名空间调用。我查看了PostgreSQL中用户定义函数的文档,发现Cypher不是支持的语言之一。但是,我不确定如何使用Cypher为接受多个参数的函数编写模式。
我已经尝试使用扩展CREATE EXTENSION plpython3u安装Cypher语言,但我仍然不确定如何继续。有人能提供一个例子,说明如何在PostgreSQL中使用Cypher创建一个带有多个参数的用户定义函数吗?

zi8p0yeb

zi8p0yeb1#

带参数函数:

CREATE OR REPLACE FUNCTION pg_catalog.is_in_list(list agtype, size agtype, what agtype)
    RETURNS boolean AS $$
    BEGIN
      FOR i IN 0..size-1 LOOP
         IF list->i = what
         THEN
            RETURN TRUE;
         END IF;
      END LOOP;
    RETURN FALSE;
    END;
    $$ LANGUAGE plpgsql;

调用函数:

SELECT * FROM cypher('muse', $$
MATCH (record:jazz)
WHERE pg_catalog.is_in_list(record.tags, size(record.tags), 'mellow')
RETURN record
$$) as (record agtype);

示例节点:

SELECT * FROM cypher('muse', $$
CREATE(r: jazz {
name: 'Kind of Blue',
artist: 'Miles Davis',
date: '17 August 1959',
sub_genre: ['Modal Jazz', 'Cool Jazz'],
tags: ['instrumental', 'mellow', 'nocturnal', 'soothing', 'improvisation', 'progressive', 'calm'],
rating: 4.31
}) RETURN r
$$) as (jazz_record agtype);

你可以创建不带参数的自定义函数,如下所示:

CREATE OR REPLACE FUNCTION pg_catalog.current_timestamp_components()
RETURNS TEXT AS $$
DECLARE
  ts_text TEXT;
BEGIN
  SELECT to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') INTO ts_text;
  RETURN ts_text;
END;
$$ LANGUAGE plpgsql;

调用函数:

SELECT *
FROM cypher('graph', $$
    CREATE (:Person {name: 'Time', title: 'Developer', time: pg_catalog.current_timestamp_components()})
$$) as (n agtype);

有用链接:如何使用Cypher查询在顶点列表中进行匹配?

9lowa7mx

9lowa7mx2#

您必须遵循此Setup for Apache AGE,并在安装后使用以下命令:

CREATE EXTENSION age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;

然后,你可以使用这个例子创建你的函数,从这里:

CREATE OR REPLACE FUNCTION public.get_event_year(name agtype) RETURNS agtype AS $$
    SELECT year::agtype
    FROM history AS h
    WHERE h.event_name = name::text
    LIMIT 1;
$$ LANGUAGE sql;

你可以使用动态Cypher在你的函数中使用Cypher查询,这里是一个从这里提取的例子:

CREATE OR REPLACE FUNCTION get_actors_who_played_role(role agtype)
RETURNS TABLE(actor agtype, movie agtype)
LANGUAGE plpgsql
AS $function$
DECLARE sql VARCHAR;
BEGIN
        load 'age';
        SET search_path TO ag_catalog;

        sql := format('
        SELECT *
        FROM cypher(''imdb'', $$
            MATCH (actor)-[:acted_in {role: %s}]->(movie:movie)
            RETURN actor.name, movie.title
        $$) AS (actor agtype, movie agtype);
    ', role);

        RETURN QUERY EXECUTE sql;

END
$function$;

相关问题