我想递归地跟踪SurrealDB中的相关记录,但找不到表达它的语法。
我的目标最简单的解释是 Neo4j/Cypher 的可变长度模式匹配。更一般地说,我想从记录开始并遵循特定的关系,直到停止(通过步骤数或其他条件),其中我不知道开始和结束之间需要多少个关系步骤。
我能找到的最接近的内容在“无连接”部分中进行了讨论。这不能满足我的需要,因为查询指定了开始和结束之间的步骤数。我正在想象类似的东西SELECT {->parent->person REPEATED 1..5} FROM person:tobie,它将找到托比 5 代人的所有祖先(person:tobie->parent->person,person:tobie->parent->person->parent->person,等等)。
如果这不是 SurrealQL 功能的一部分,您能给我一些获得相同结果的其他方法的提示吗?我考虑过使用脚本函数,它看起来很强大,但很另类。
根据您想要遍历的深度(surrealDB 对递归查询有内部限制),您可以递归地使用自定义函数:
类似的东西应该有效(我个人使用类似的东西,但带有记录链接):
DEFINE FUNCTION fn::traverse_recurse($el: record) {
$parent = SELECT ->parent->person FROM $el;
return if ($parent is not none) then
return array::concat([$parent], fn::traverse_recurse($parent))
else
return []
end;
};
SELECT *, fn::traverse_recurse($this.id) as ancestry from person:tobie;
Run Code Online (Sandbox Code Playgroud)