【问题标题】:Neo4j - Adding logic to graph traversalNeo4j - 为图遍历添加逻辑
【发布时间】:2012-12-17 16:22:39
【问题描述】:

简而言之,我的问题是我是否可以修改 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 可以配置成这样的图遍历逻辑吗? 谢谢!!

【问题讨论】:

标签: graph neo4j reachability graph-traversal


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多