【问题标题】:ArangoDB Quick api to know if 2 document keys has edges b/w themArangoDB 快速 api 知道 2 个文档键是否有边缘 b/w
【发布时间】:2017-12-18 12:25:34
【问题描述】:

如果我有 2 个顶点 V1 和 V2。哪种方法为我提供了这两个顶点的直接边数组。

集合 c

V1 = {"name": "a"}
V2 = {“名称”:“b”}

边缘 e

E1 = (V1, V2, {"count": 1})

现在,我再次添加 V2(即它具有相同的密钥)。首先,我想快速获得E1。理想情况下,我在想如果我们在 Arangodb 有类似的东西

edgeList = db.e.edges(v1, v2);

它应该返回边数组 b/w v1 和 v2。

我正在寻找这个 db.e.edges 的最佳实践

再次添加 V2 后,E1 将如下所示:

E1 = (V1, V2, {"count" : 2})

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    您可以使用以下 AQL 方法来解决此问题:

    1. GRAPH_SHORTEST_PATH

      RETURN GRAPH_SHORTEST_PATH("yourGraph", "V1_ID", "V2_ID", {direction : "any"})

    这将返回这些边之间的短路路径,如果长度为 1,则 V1 和 V2 之间有直接边

    1. GRAPH_EDGES

    RETURN GRAPH_EDGES("yourGraph", "V1_ID", {maxDepth : 1, direction : "any"})

    这将为 V1 返回最大深度为 1 的所有传入和传出边,只需过滤 V2 的结果

    【讨论】:

    • 我是 Arangodb 的新手,并且没有在 Graph 方面取得进展,所以我没有这样的图表。我有 2 个集合 'm' 作为文档,'e' 作为边缘。在向 m 添加新文档时,我正在搜索是否需要更新或创建边缘。我正在使用这种方法:[code] v2 = //my new doc docs = db.metrics.range("time", timeStart, docTime); while(docs.hasNext()) { v1 = docs.next(); db.link.outEdges(v1).forEach(function(edge) { newedge = null; if(edge._to == v2._id) { print('Edge需要更新'); createRequired = false; newedge = edge ; 返回; } }); } [/code]
    • 我想最好的做法是先创建图表,然后遍历它而不是我正在做的方式?
    • 是的,如果你想了解顶点之间的关系(边),你肯定要使用图形模块:
    【解决方案2】:

    我仍然不确定你的目标是什么。请注意,当您创建一个新顶点(在您的示例 V2 中)时,顶点 ID 是新创建的,因此不在任何已经存在的边中。 请描述您到底想做什么,我会尽力给您一个最佳实践示例

    【讨论】:

      【解决方案3】:

      好的,我检查了这个,暂时你必须调用 AQL 来检查 2 个顶点之间的现有边:

      db._query("FOR i in GRAPH_EDGES("yourGraphName",v1,{neighborExamples : v2}) RETURN i").toArray();
      

      我们很快会在 2.3.1 中提供一个更方便的方法,它将在图形模块中,可以这样使用:

      // get an instance of the graph Module
      var graphModule = require("org/arangodb/general-graph");
      // load your graph 
      var graph = graphModule._graph("yourGraphName");
      // get an array of edges between v1 and v2
      graph._getConnectingEdges(v1, v2)
      

      【讨论】:

        【解决方案4】:

        在 ArangoDB v.3 中,您可以检索两个顶点 V1 和 V2 之间的所有边(在边集合 e1,... eN 中),如下所示:

        FOR v, e IN 1..1 ANY V1 e1 ... eN
          FILTER v == V2
          RETURN e
        

        如果您只想要一个计数,而不是像上面那样计算数组,那么将上面的最后一行替换为:

          COLLECT WITH COUNT INTO c
          RETURN c
        

        增加V2

        再次添加V2后

        从字面上看,这在 ArangoDB 中似乎没有任何意义。也许您的意思是添加另一个优势?

        【讨论】:

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