postgresql Apache AGE中的图的连通性?

p8h8hvxi  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(3)|浏览(335)

如何在Apache AGE中检查图的连通性?
如果节点被标记为“顶点”,边被标记为“距离”,那么,这是我的Cypher查询:

MATCH (start:vertex)
OPTIONAL MATCH path = (start)-[:distance*]-(end:vertex)
WHERE end IS NULL
RETURN CASE WHEN path IS NULL THEN 'Graph is not connected' ELSE 'Graph is connected' END AS result;

在此查询中,MATCH子句匹配标记为“vertex”((start:vertex))的起始节点。OPTIONAL MATCH子句然后尝试使用“距离”关系找到从起始顶点到图中的任何其他顶点的路径(path =(start)-[:distance*]-(end:vertex))。
谁能给予我一个完整的实施指南?

2g32fytz

2g32fytz1#

通过自动化检查图的正确性是一个挑战,所以我建议只根据直觉来做。如果您对数据有足够的了解,那么您应该能够知道从输出中可以期待什么。使用AGE查看器也有助于可视化数据以查看关系。
至于您的代码,(end:vertex)WHERE end IS NULL处将发生错误,因为end令牌将被解释为END命令,因此您必须将别名重命名为其他名称。虽然我怀疑它是否能通过你所寻找的,从从句的选择来判断。这样的东西可能是你正在寻找的:

SELECT *
FROM cypher('graph_name', $$                                                                                                
    MATCH path = (start:vertex)-[:distance*]->(finish:vertex)                                                                             
    WITH path                                                                                                                           
    RETURN CASE WHEN path IS NULL THEN 'Graph is not connected' ELSE 'Graph is connected' END AS result
$$) AS (v agtype);

你可以在网上找到几个指南,包括AGE master documentation甚至Neo4j cypher documentation,用于更具体和复杂的查询(尽管注意,与Neo4j的密码语言相比,AGE的功能有限)。如果您专门尝试从数据中查找路径,则会问一些密切相关的问题,例如这个问题。

aij0ehis

aij0ehis2#

如果图是连通的,你可以使用N作为顶点的总数,那么从开始顶点到结束顶点,它们之间需要N-1条边。所以,基本上你首先得到图的顶点数:

SELECT * FROM cypher('graph_name', $$
    MATCH (v:vertex)
    RETURN COUNT(v)
$$) AS (total_vertices agtype);

现在,您使用此信息构建一个检查连通性的查询,假设我们有10个顶点:

SELECT * FROM cypher('graph_name', $$                                                                                                
    MATCH path = (start:vertex)-[*9..]->(finish:vertex)                                                                             
    WITH path                                                                                                                           
    RETURN CASE WHEN path IS NULL THEN 'Graph is not connected' ELSE 'Graph is connected' END
$$) AS (result agtype);

这样,我们就知道每个顶点都有一条与其相邻的边。你也可以动态地尝试一下:

SELECT * FROM cypher('graph_name', $$
    MATCH (v:vertex)
    WITH count(v) AS total_vertices
    MATCH path = (start:vertex)-[*(total_vertices-1)..]->(finish:vertex)                                                                             
    WITH path                                                                                                                           
    RETURN CASE WHEN path IS NULL THEN 'Graph is not connected' ELSE 'Graph is connected' END
$$) AS (result agtype);
pbwdgjma

pbwdgjma3#

您可以使用以下准则进行实现。
1.首先创建图形并包括顶点和边标签。

SELECT * FROM create_graph('my_graph');
 SELECT create_vlabel('my_graph', 'vertex');
 SELECT create_elabel('my_graph', 'distance');

1.要检查有效性和正确性,请尝试以下查询:
MATCH(start:vertex)
可选匹配路径=(开始)-[:距离 *]-(结束:顶点)
WHERE end为NULL
当路径为空时返回大小写THEN '图形未连接' ELSE '图形已连接' END作为结果;

相关问题