postgresql 当传入的参数是PATH时,AGE函数如何工作?

ubof19bj  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(111)

我已经分析了age_relationships()函数的行为(可以在这里找到),并查看了它在GDB中的工作方式,似乎每个可用路径都会多次调用该函数。因此,例如,如果我们想找到两个节点之间的所有路径,必须执行以下查询:

SELECT * FROM cypher('graph_name', $$
MATCH (v:Person {lastName: 'Beran'}), (v2:Person {lastName: 'Jones'}), p=((v)-[Knows*..15]-(v2))
RETURN relationships(p)
$$) AS (shortestpath agtype);

字符串
relationships(p)-与age_relationships()相同-将为这两个顶点之间的每条路径调用多次。虽然我认为所有的路径都会被这个函数找到并检索,就像下面的伪代码一样:

age_relationships(paths):
    for every path in paths:
        retrieve path


它的工作原理正好相反:

for every path in paths:
    age_relationships(path):
        retrieve path


为什么会这样?

v6ylcynt

v6ylcynt1#

这是因为Cypher MATCH子句在类似(v)-[*]-(v2)的查询中查找并检索两个节点之间的每条路径。因此,函数relationships采用该路径并从该路径检索每隔一个的条目(以仅获得边)。
要更好地理解此路径的构造方式,可以调试cypher_clause.c文件中的transform_cypher_match函数和其他相关函数。

hiz5n14c

hiz5n14c2#

原因是,当Cypher Query将结果返回给函数age_relationships(paths)时,该函数会单独处理每条路径。
通过在每个路径上单独工作的方法,该过程对于复杂查询变得性能优化。

相关问题