使用 ArangoDB EDGES 函数,无法使用 includeVertices 选项获得正确的顶点
Using ArangoDB EDGES function, can't get the right vertex with includeVertices options
用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)的顶点。
我尝试使用 "inbound" 作为方向,而不是 "outbound".
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 的顶点。这三个结果似乎不一致:对于 "inbound"/"outbound" :顶点是 u4,而对于 "any" 顶点是 "u1"。
我的代码中有错误吗?我应该使用的选项?
谢谢,
鲍勃·西特龙
非常感谢您发现这一点,它实际上是我们核心中的一个错误,而不是您的代码中的错误
我刚刚修复了它,它将包含在下一个 2.6 中。错误修复版本和 2.7(开发)。
预期的行为如您所描述。
您真的需要存储在 Edge 中的信息吗?
如果不是,您可以考虑在这种情况下使用 NEIGHBORS 函数,它的性能更高。
用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)的顶点。 我尝试使用 "inbound" 作为方向,而不是 "outbound".
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 的顶点。这三个结果似乎不一致:对于 "inbound"/"outbound" :顶点是 u4,而对于 "any" 顶点是 "u1"。 我的代码中有错误吗?我应该使用的选项?
谢谢,
鲍勃·西特龙
非常感谢您发现这一点,它实际上是我们核心中的一个错误,而不是您的代码中的错误
我刚刚修复了它,它将包含在下一个 2.6 中。错误修复版本和 2.7(开发)。 预期的行为如您所描述。
您真的需要存储在 Edge 中的信息吗? 如果不是,您可以考虑在这种情况下使用 NEIGHBORS 函数,它的性能更高。