我已经分析了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
型
为什么会这样?
2条答案
按热度按时间v6ylcynt1#
这是因为Cypher MATCH子句在类似
(v)-[*]-(v2)
的查询中查找并检索两个节点之间的每条路径。因此,函数relationships
采用该路径并从该路径检索每隔一个的条目(以仅获得边)。要更好地理解此路径的构造方式,可以调试
cypher_clause.c
文件中的transform_cypher_match
函数和其他相关函数。hiz5n14c2#
原因是,当Cypher Query将结果返回给函数
age_relationships(paths)
时,该函数会单独处理每条路径。通过在每个路径上单独工作的方法,该过程对于复杂查询变得性能优化。