【问题标题】:ArangoDB: is it possible to 'fake' edges in a graph traversal?ArangoDB:是否可以在图遍历中“伪造”边缘?
【发布时间】:2016-02-16 20:17:13
【问题描述】:

我有一个复杂的图表。我正在使用带有相当复杂的expanderFunction 和traversalVisitor 的遍历(通过ArangoJS)。

对于这种遍历,我想知道是否可以在我的图中的某些节点之间创建动态关系(或 fake 关系):也就是说,基于顶点,让遍历继续进行图探索,就好像当前顶点和另一个顶点之间存在边一样。

我试图欺骗 expander 函数,将假边(从当前顶点到图中另一个不相关的顶点)推入遍历数据结构中,例如:

if (complex_criteria(vertex)) {
    var unconnectedVertexId = ... 
    var unconnectedVertex = someCollection.document(unconnectedVertexId);
    connected.push({ edge:{_id:'newId', _from:vertex._id, _to:unconnectedVertex._id}, vertex: unconnectedVertex });
}
..
return connected;

这不起作用。 (遍历选项为:direction: 'outbound', strategy: "depthfirst"

有更好的主意吗?

谢谢!

【问题讨论】:

    标签: graph arangodb


    【解决方案1】:

    我认为你的代码有一个小错误:

    if (complex_criteria(vertex)) {
        var unconnectedVertexId = ... 
        var unconnectedVertex = someCollection.document(unconnectedVertexId);
        connected.push({ edge:{_id:'newId', _from:vertex._id, _to:unconnectedVertex._id}, vertex: unconnectedVertex });
    }
    ..
    return connected;
    

    “假边”_to 必须指向unconnectedVertex._id,而不是对象本身。 你能检查一下这是否已经解决了问题吗?

    【讨论】:

    • _id:这已经在我的测试用例中了。为清楚起见,更改上面的变量名称时出错。我已经更正了这个问题。你知道在 ArangoDB 代码中的什么地方我可以看到扩展器中的 connected 数据结构是如何使用的吗?我认为以后使用这种数据结构的方式可能存在一些限制..(比如可能试图从不存在的边缘 id 中获取边缘?)可以帮助.. 干杯
    • 您要查找的文件是当前开发分支中的js/common/modules/@arangodb/graph/traversal.jsjs/common/modules/org/arangodb/graph/traversal.js3 调用config.expander 这是相关的地方。从我所看到的情况来看,内置函数在“扩展”之后没有验证边缘。也许_id 是在内部评估的,所以请确保它至少看起来正确。未连接的顶点经过验证,如果 id 不为 arango 所知,则 unconnectedVertex 将为空,可能会导致问题。
    • 我已经从遍历选项中抑制了“方向”属性。 (文档目前对此不清楚,指出“如果未设置方向属性,则必须设置扩展器”)
    • 解释是否回答了您的问题?如果是,您可以将其标记为已接受吗?如果没有,缺少什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多