使用ArangoDB描述朋友关系,我想知道特定用户A的朋友。因为这是一个测试样本,我知道A是B的朋友。
我在文档集合和边缘集合中有用户,其中包含来自“_from”的朋友到“_to”的信息。如果A是B的朋友,B必须是A的朋友。即:如果有一个边_从A到B,则从B到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”。 我的代码中有错误吗?我应该使用哪个选项?
谢谢,
BobCitron
答案 0 :(得分:1)
非常感谢您发现这一点,它实际上是我们核心中的一个错误而不是您的代码
我刚刚解决了它,它将包含在下一个2.6中。 bugfix发布和2.7(开发)。 预期的行为如您所述。
您是否真的需要存储在边缘的信息? 如果没有,你可以考虑在这种情况下使用NEIGHBORS功能,这是更高效的。