如何在SurrealDB中遍历未知长度的路径?

Zac*_*len 9 surrealdb

我想递归地跟踪SurrealDB中的相关记录,但找不到表达它的语法。

我的目标最简单的解释是 Neo4j/Cypher 的可变长度模式匹配。更一般地说,我想从记录开始并遵循特定的关系,直到停止(通过步骤数或其他条件),其中我不知道开始和结束之间需要多少个关系步骤。

我能找到的最接近的内容在“无连接”部分中进行了讨论。这不能满足我的需要,因为查询指定了开始和结束之间的步骤数。我正在想象类似的东西SELECT {->parent->person REPEATED 1..5} FROM person:tobie,它将找到托比 5 代人的所有祖先(person:tobie->parent->person,person:tobie->parent->person->parent->person,等等)。

如果这不是 SurrealQL 功能的一部分,您能给我一些获得相同结果的其他方法的提示吗?我考虑过使用脚本函数,它看起来很强大,但很另类。

Nat*_*arz 1

根据您想要遍历的深度(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)