我想从我创建的两个不同图形中检索所有顶点(一个称为
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)
那么,如何在单个查询中返回这两个图中的顶点?
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);
不,不幸的是,您不能使用 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();
根据文档,您可以使用 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;
从 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);
您无法使用密码查询对两个图进行查询。但是,普通的 SQL 查询将访问此文档以获取更多信息。
您需要相应地修改查询
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);