3

使用 ArangoDB 描述好友关系,我想知道特定用户 A 的好友。因为是测试样本,所以我知道 A 和 B 是好友。

我在文档集合和边缘集合中有用户,其中包含从“_from”成为朋友到“_to”的信息。如果 A 是 B 的朋友,则 B 必须是 A 的朋友。即:如果存在一条边 _from A _to B,则确实存在另一条边 _from B _to A。

我在我的朋友集合上使用了函数 EDGES,以知道用户“u4”的哪个朋友,哪个 _id 是 2465087832。他必须是“u1”的朋友,哪个 _id 是 2462335320。因为我想拥有的不仅仅是文档 ID,我将选项“includeVertices”设置为 true。

这是我的要求。

LET out = EDGES(friends, "db/2465087832", "outbound", null, {includeVertices: true})

答案是:

[
    {
      "edge": {
        "_id": "db/2468102488",
        "_from": "db/2465087832",
        "_to": "db/2462335320",
        "_rev": "2468102488",
        "_key": "2468102488"
      },
      "vertex": {
        "_id": "db/2465087832",
        "_key": "2465087832",
        "_rev": "3962323288",
        "id": "u4"
      }
    }
  ]

结果,我有很好的优势(u4 是 u1 的朋友),但包含的顶点是来自请求用户的顶点(id:u4)。我尝试使用“入站”作为方向,而不是“出站”。

LET out = EDGES(friends, "db/2465087832", "inbound", null, {includeVertices: true})

结果是:

 [
    {
      "edge": {
        "_id": "db/2468364632",
        "_from": "db/2462335320",
        "_to": "db/2465087832",
        "_rev": "2468364632",
        "_key": "2468364632"
      },
      "vertex": {
        "_id": "db/2465087832",
        "_key": "2465087832",
        "_rev": "3962323288",
        "id": "u4"
      }
    }
  ]

如您所见,仍然是“u4”作为顶点,即使是边缘也是好的(u1 是 u4 的朋友)。

最后,我尝试用“any”作为方向。

LET any = EDGES(friends, "db/2465087832", "any", null, {includeVertices: true})

和令人惊讶的答案:

[
    {
      "edge": {
        "_id": "friends/2468364632",
        "_from": "user/2462335320",
        "_to": "user/2465087832",
        "_rev": "2468364632",
        "_key": "2468364632"
      },
      "vertex": {
        "_id": "user/2462335320",
        "_rev": "3956687192",
        "_key": "2462335320",
        "id": "u1"
      }
    },
    {
      "edge": {
        "_id": "friends/2468102488",
        "_from": "user/2465087832",
        "_to": "user/2462335320",
        "_rev": "2468102488",
        "_key": "2468102488"
      },
      "vertex": {
        "_id": "user/2462335320",
        "_rev": "3956687192",
        "_key": "2462335320",
        "id": "u1"
      }
    }
  ]

这里的答案包含两个边(A 到 B 和 B 到 A),这是正确的,但是对于两个顶点都是来自 u1 的那个。这三个结果似乎不一致:对于“入站”/“出站”:顶点是 u4,而对于“任何”,顶点是“u1”。我的代码中有错误吗?我应该使用的选项?

谢谢,

鲍勃西特龙

4

1 回答 1

1

非常感谢您发现这一点,这实际上是我们核心中的一个错误,而不是您的代码

我只是修复了它,它将包含在下一个 2.6 中。错误修复版本和 2.7(开发)。预期的行为如您所描述。

您真的需要存储在 Edge 中的信息吗?如果没有,您可以考虑在这种情况下使用 NEIGHBORS 函数,它的性能更高。

于 2015-09-22T09:56:34.503 回答