在 ArangoDB 中向上遍历
Traverse up in ArangoDB
我正在尝试通过 PHP 学习 ArangoDB。我目前设置了以下图表:
用户 -> 用户邮箱 -> 邮箱
'User'和'Email'是顶点集合,'userEmail'是边集合。
我正在使用此模型进行用户身份验证,根据请求,代码会将给定的电子邮件与数据库进行匹配,获取该节点和 return 传入的 'userEmail' 边缘和 'User' 节点,但前提是 属性 'primary' 在 'userEmail' 边上设置为 'TRUE'。
当前解
我正在使用以下作为当前的解决方案,但我认为这不是实现我想要的目标的最佳方式。它也没有给我一种检测 'userEmail' 边缘
上的 'primary' 字段的方法
FOR e IN email
FILTER e.address == @email
RETURN {
'email': e,
'user': NEIGHBORS(email, userEmail, e, 'inbound', [], {includeData:true})
}
其他解决方案
我也用过这个方案,结果一样
FOR e IN email
FILTER e.address == @email
LET u = (NEIGHBORS(email, userEmail, e, 'inbound', [], {includeData:true}))
RETURN u
另一种解决方案
我想到的另一个解决方案是
FOR e in email
FILTER e.address == @email
FOR p IN TRAVERSAL(user, userEmail, e._id, "inbound", {paths: true})
RETURN p
这 return 是顶点和边,但仅在第二组结果中正确。我可以硬编码使用第二组 returned 值,但我认为这不是最好的方法。
当前的解决方案是最好的还是有更好的方法来做我想做的事情?
为此您应该使用 ArangoDB 2.8 new style pattern matching traversals to start with. Lets adopt the query with the geoindex:
FOR oneEmail IN email
FILTER oneEmail.address == @email
FOR v, e IN 1..1 INBOUND oneEmail userEmail
FILTER e.primary == true
RETURN {
'email': oneEmail.address,
'user': v
}
要在 old style NEIGHBORS queries 中添加您在问题中使用的主要过滤器,请使用 edgeExamples
参数:
FOR e IN email
FILTER e.address == @email
RETURN {
'email': e,
'user': NEIGHBORS(email, userEmail, e, 'inbound',
[{ Primary : true }],
{includeData:true})
}
一般来说,如果电子邮件始终只能属于一个用户(1:n 关系),我首先质疑您选择图表是否是首选方式,and joins without an edge collection 会是更好的选择.
我正在尝试通过 PHP 学习 ArangoDB。我目前设置了以下图表:
用户 -> 用户邮箱 -> 邮箱
'User'和'Email'是顶点集合,'userEmail'是边集合。
我正在使用此模型进行用户身份验证,根据请求,代码会将给定的电子邮件与数据库进行匹配,获取该节点和 return 传入的 'userEmail' 边缘和 'User' 节点,但前提是 属性 'primary' 在 'userEmail' 边上设置为 'TRUE'。
当前解
我正在使用以下作为当前的解决方案,但我认为这不是实现我想要的目标的最佳方式。它也没有给我一种检测 'userEmail' 边缘
上的 'primary' 字段的方法FOR e IN email
FILTER e.address == @email
RETURN {
'email': e,
'user': NEIGHBORS(email, userEmail, e, 'inbound', [], {includeData:true})
}
其他解决方案
我也用过这个方案,结果一样
FOR e IN email
FILTER e.address == @email
LET u = (NEIGHBORS(email, userEmail, e, 'inbound', [], {includeData:true}))
RETURN u
另一种解决方案
我想到的另一个解决方案是
FOR e in email
FILTER e.address == @email
FOR p IN TRAVERSAL(user, userEmail, e._id, "inbound", {paths: true})
RETURN p
这 return 是顶点和边,但仅在第二组结果中正确。我可以硬编码使用第二组 returned 值,但我认为这不是最好的方法。
当前的解决方案是最好的还是有更好的方法来做我想做的事情?
为此您应该使用 ArangoDB 2.8 new style pattern matching traversals to start with. Lets adopt the query with the geoindex:
FOR oneEmail IN email
FILTER oneEmail.address == @email
FOR v, e IN 1..1 INBOUND oneEmail userEmail
FILTER e.primary == true
RETURN {
'email': oneEmail.address,
'user': v
}
要在 old style NEIGHBORS queries 中添加您在问题中使用的主要过滤器,请使用 edgeExamples
参数:
FOR e IN email
FILTER e.address == @email
RETURN {
'email': e,
'user': NEIGHBORS(email, userEmail, e, 'inbound',
[{ Primary : true }],
{includeData:true})
}
一般来说,如果电子邮件始终只能属于一个用户(1:n 关系),我首先质疑您选择图表是否是首选方式,and joins without an edge collection 会是更好的选择.