2

简而言之,我的问题是——我是否可以修改 Neo4j 使用的遍历逻辑——在可达性计算期间,如何控制哪些边被遍历,哪些不被遍历。

详细描述:

我正在考虑从我们当前的数据库迁移到 neo4j,我想知道 neo4j 是否适合以下任务:

我们有大约 1000 万个简单节点的大图——它们的属性只有一个 id。
我们也有 3 种边缘 - “标准”、“打开”和“关闭”。"opening" 和 "closeing" 也有一个 "color" 属性,所以它们是匹配的。每个“开放”边都有一个匹配的“关闭”边“。例如,有一个颜色为“3”的开放边缘,所以也有一个颜色相同的关闭边缘。

我们需要解决两个节点之间的可达性问题,其中遍历规则相当简单:您可以随意通过标准边,也可以根据需要通过开放边,同时保持访问的“开放”边的顺序堆栈但是(这是棘手的部分)当你来到一个有几个“关闭”边缘的交叉点时,你必须穿过与遇到的最后一个“打开”边缘匹配的关闭边缘,然后从堆。

例如:

a -[标准]->B-[打开颜色:3]->C-[标准]->D-[关闭颜色:3]->E
还有
D-[关闭颜色:4]->F

请注意,D 有两个“闭合”边缘,颜色不同。根据上面定义的规则,A 可以访问 E,因为颜色堆栈的顶部有 [3]。
然而,A 无法到达 F。

可以为这样的图遍历逻辑配置 neo4j 吗?谢谢!!

4

1 回答 1

0

这可以通过实现您自己的 PathExpander 并传递给 TraversalDescription 来实现。正如 Michael Hunger 指出的那样:BranchState 可用于优化您的扩展器,这样您就不必检查每次扩展的完整路径,而是每个遍历分支携带的某种归结(不可变的)状态。扩展器可以将修改后的状态传递给每个下一步。

不幸的是,neo4j 手册缺乏使用分支状态的好例子。这听起来像一个很棒的用法!

于 2013-01-09T13:41:09.523 回答