如何使用 ApacheAGE 在单个查询中从不同图返回顶点?

问题描述 投票:0回答:7

我想从我创建的两个不同图形中检索所有顶点(一个称为

family_tree
,另一个称为
taxonomy_biology
),并使用以下命令来执行此操作:

SELECT * FROM cypher ('family_tree' AND 'taxonomy_biology', $$
MATCH (v)
RETURN v
$$) as (vertex agtype);

但是,终端返回此错误:

ERROR:  invalid input syntax for type boolean: "family_tree"
LINE 1: SELECT * FROM cypher('family_tree' AND 'taxonomy_biology', $...

猜测 ApacheAGE 是如何工作的,它将搜索所有可用的图表,如果存在同名的可用图表,则返回

true
,如果没有,则返回
false
。然而,传递两个确实存在的图将会导致错误。

顺便说一句,输入相同的查询,但对于每个图表,返回以下内容:

SELECT * FROM cypher('taxonomy_biology', $$
MATCH (v)
RETURN v
$$) as (VERTEX agtype);
                                         vertex
-----------------------------------------------------------------------------------------
 {"id": 844424930131969, "label": "Kingdom", "properties": {"name": "Animalia"}}::vertex
 {"id": 1125899906842625, "label": "Phylum", "properties": {"name": "Cnidaria"}}::vertex
(2 rows)
SELECT * FROM cypher('family_tree', $$                                                                                                                      MATCH (v)
RETURN v
$$) as (VERTEX agtype);
                                                                                                       vertex

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 {"id": 844424930131969, "label": "Person", "properties": {"name": "Louis", "titles": ["Emperor of the Carolingian Empire", "King of the Franks", "King of Aquitaine"], "year_born": 778, "year_died": 840}}::vertex
 {"id": 844424930131970, "label": "Person", "properties": {"name": "Hildegard", "titles": ["Frankish queen consort"], "year_born": 754, "year_died": 783}}::vertex
 {"id": 844424930131971, "label": "Person", "properties": {"name": "Charlemagne", "titles": ["Holy Roman Emperor", "King of the Franks", "King of the Lombards"], "year_born": 747, "year_died": 814}}::vertex
(3 rows)

那么,如何在单个查询中返回这两个图中的顶点?

postgresql cypher graph-databases apache-age
7个回答
1
投票

UNION 子句应该可以正常工作,另一种替代方法是使用 JOIN 子句,就像 Apache 文档

中的示例一样

在您的情况下,使用 UNION 的代码应该是这样的:

SELECT * 
FROM cypher ('family_tree', $$
    MATCH (v)
    RETURN v
$$) as (vertex agtype)
UNION 
SELECT * 
FROM cypher ('taxonomy_biology', $$
    MATCH (v)
    RETURN v
$$) as (vertex agtype);

1
投票

不,不幸的是,您不能使用 cypher 函数在单个查询中查询多个图。 cypher 函数的第一个参数必须是单个图名称,而不是图名称列表。 Wendel 提供的一个可能的解决方案是使用

UNION
子句。

您可以尝试的另一种方法是编写一个自定义函数或存储过程,从两个图中检索所有顶点并将它们作为单个结果集返回。 例如:

CREATE OR REPLACE FUNCTION get_all_vertices()
RETURNS TABLE(vertex agtype)
LANGUAGE plpgsql
AS $BODY$
BEGIN
    LOAD 'age';
    SET search_path TO ag_catalog;

    RETURN QUERY
        SELECT * FROM cypher('family_tree', $$ MATCH (n) RETURN n $$) as (n agtype)
        UNION
        SELECT * FROM cypher('taxonomy_biology', $$ MATCH (n) RETURN n $$) as (n agtype);
END
$BODY$;

创建此函数后,您可以在 SELECT 语句中使用它来检索两个图中的所有顶点:

SELECT * FROM get_all_vertices();

1
投票

查询返回错误,因为

cypher()
函数的语法不允许组合两个图形。

要查询多个图,请根据

AGE 文档
使用
JOIN
ON 子句。


1
投票

根据文档,您可以使用 JOIN 子句查询多个图。例如,您可以使用以下查询从

family_tree
taxonomy_biology
返回顶点:

SELECT family_tree, taxonomy_biology
FROM cypher('family_tree', $$
MATCH (v)
RETURN v
$$) as family_tree(vertex agtype)
JOIN cypher('taxonomy_biology', $$
MATCH (n)
RETURN n
$$) as taxonomy_biology(vertex agtype)
ON family_tree = taxonomy_biology;

1
投票

从 AGE 返回表后,它与任何 Postgress 表相同。您可以使用 Postgres 上提供的所有操作,例如 Join、Union、Intersect 和 except。 官方文档

此代码将满足您的目的。

SELECT * FROM cypher ('family_tree', $$
    MATCH (v)
    RETURN v
$$) as (vertex agtype)
JOIN 
SELECT * FROM cypher ('taxonomy_biology', $$
    MATCH (v)
    RETURN v
$$) as (vertex agtype);

0
投票

您无法使用密码查询对两个图进行查询。但是,普通的 SQL 查询将访问此文档以获取更多信息。


0
投票

您需要相应地修改查询

SELECT * FROM cypher('family_tree', $$
MATCH (v)
RETURN v
$$) as (vertex agtype)
UNION ALL
SELECT * FROM cypher('taxonomy_biology', $$
MATCH (v)
RETURN v
$$) as (vertex agtype);
© www.soinside.com 2019 - 2024. All rights reserved.