使用 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”。我的代码中有错误吗?我应该使用的选项?
谢谢,
鲍勃西特龙