Graph 图表-显示朋友的朋友(和一级普通朋友)
我发现了一个“friends of friend”遍历查询,它满足了我获取friends of friends()的基本需求。我对其进行了一些修改,使其能够与文档中的“Knows_Graph”示例一起使用,并添加了一些额外的人员() 我的查询以Dave为起点,通过Bob和Lucy寻找他的二级朋友。该脚本运行良好,但我还希望它在查询结果中包含一级好友(bob和lucy)。我可以通过将最小深度设置为1来实现这一点,但是如果我这样做,我不会区分Bob和Lucy的深度(参见json输出),因此我无法在更大的图上区分谁是1度,谁是2度 最小深度为2的示例代码Graph 图表-显示朋友的朋友(和一级普通朋友),graph,social-networking,arangodb,Graph,Social Networking,Arangodb,我发现了一个“friends of friend”遍历查询,它满足了我获取friends of friends()的基本需求。我对其进行了一些修改,使其能够与文档中的“Knows_Graph”示例一起使用,并添加了一些额外的人员() 我的查询以Dave为起点,通过Bob和Lucy寻找他的二级朋友。该脚本运行良好,但我还希望它在查询结果中包含一级好友(bob和lucy)。我可以通过将最小深度设置为1来实现这一点,但是如果我这样做,我不会区分Bob和Lucy的深度(参见json输出),因此我无法在
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v IN 2..2 ANY person knows
RETURN v
)
RETURN MERGE(person, { foaf } )
该示例使用“knows”边缘集合和“person”集合
这里是json输出,如果最小深度为1,最大深度为2。正如您所看到的,bob和lucy与其他人在同一收藏级别上展出。我想找到一种方法,以某种方式将它们显示为第一级,而不会使查询过于复杂或导致性能问题
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U7wRsJG--_",
"name": "Dave",
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8--wPq---",
"name": "Lucy"
},
{
"_key": "henry",
"_id": "persons/henry",
"_rev": "_U8-_FNa---",
"name": "Henry"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U7wRsJC--_",
"name": "Bob"
},
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U7wRsJG---",
"name": "Charlie"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U7wRsJC---",
"name": "Alice"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U7wRsJG--A",
"name": "Eve"
}
]
}
]
通过以下查询,您可以获得每个朋友的深度信息
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
RETURN {v, depth: LENGTH(p.edges)}
)
RETURN MERGE(person, { foaf } )
输出应该如下所示:
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"v": {
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
"depth": 1
},
{
"v": {
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
},
"depth": 1
},
{
"v": {
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
"depth": 2
},
{
"v": {
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
"depth": 2
},
{
"v": {
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
},
"depth": 2
}
]
}
]
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
COLLECT depth = LENGTH(p.edges) INTO s KEEP v
RETURN {depth, foaf: s[*].v}
)
RETURN MERGE(person, { foaf } )
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"depth": 1,
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
}
]
},
{
"depth": 2,
"foaf": [
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
}
]
}
]
}
]
如果您想将各种深度的朋友分组在一起,您的查询可能如下所示:
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"v": {
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
"depth": 1
},
{
"v": {
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
},
"depth": 1
},
{
"v": {
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
"depth": 2
},
{
"v": {
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
"depth": 2
},
{
"v": {
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
},
"depth": 2
}
]
}
]
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
COLLECT depth = LENGTH(p.edges) INTO s KEEP v
RETURN {depth, foaf: s[*].v}
)
RETURN MERGE(person, { foaf } )
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"depth": 1,
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
}
]
},
{
"depth": 2,
"foaf": [
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
}
]
}
]
}
]
输出应该如下所示:
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"v": {
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
"depth": 1
},
{
"v": {
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
},
"depth": 1
},
{
"v": {
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
"depth": 2
},
{
"v": {
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
"depth": 2
},
{
"v": {
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
},
"depth": 2
}
]
}
]
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
COLLECT depth = LENGTH(p.edges) INTO s KEEP v
RETURN {depth, foaf: s[*].v}
)
RETURN MERGE(person, { foaf } )
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"depth": 1,
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
}
]
},
{
"depth": 2,
"foaf": [
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
}
]
}
]
}
]
更新
如果需要有关人员之间关系的更多信息,可以返回路径而不是顶点。路径(p
)包括所有访问的边(知道关系)和所有顶点(人)。
有关AQL遍历语法的更多信息:请参阅
通过以下查询,您可以获得每个朋友的深度信息
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
RETURN {v, depth: LENGTH(p.edges)}
)
RETURN MERGE(person, { foaf } )
输出应该如下所示:
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"v": {
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
"depth": 1
},
{
"v": {
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
},
"depth": 1
},
{
"v": {
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
"depth": 2
},
{
"v": {
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
"depth": 2
},
{
"v": {
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
},
"depth": 2
}
]
}
]
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
COLLECT depth = LENGTH(p.edges) INTO s KEEP v
RETURN {depth, foaf: s[*].v}
)
RETURN MERGE(person, { foaf } )
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"depth": 1,
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
}
]
},
{
"depth": 2,
"foaf": [
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
}
]
}
]
}
]
如果您想将各种深度的朋友分组在一起,您的查询可能如下所示:
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"v": {
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
"depth": 1
},
{
"v": {
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
},
"depth": 1
},
{
"v": {
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
"depth": 2
},
{
"v": {
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
"depth": 2
},
{
"v": {
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
},
"depth": 2
}
]
}
]
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
COLLECT depth = LENGTH(p.edges) INTO s KEEP v
RETURN {depth, foaf: s[*].v}
)
RETURN MERGE(person, { foaf } )
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"depth": 1,
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
}
]
},
{
"depth": 2,
"foaf": [
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
}
]
}
]
}
]
输出应该如下所示:
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"v": {
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
"depth": 1
},
{
"v": {
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
},
"depth": 1
},
{
"v": {
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
"depth": 2
},
{
"v": {
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
"depth": 2
},
{
"v": {
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
},
"depth": 2
}
]
}
]
LET person = DOCUMENT("persons/@persons/dave")
LET foaf = (
FOR v, e, p IN 1..2 ANY person knows
COLLECT depth = LENGTH(p.edges) INTO s KEEP v
RETURN {depth, foaf: s[*].v}
)
RETURN MERGE(person, { foaf } )
[
{
"_id": "persons/dave",
"_key": "dave",
"_rev": "_U8e0Ube---",
"foaf": [
{
"depth": 1,
"foaf": [
{
"_key": "lucy",
"_id": "persons/lucy",
"_rev": "_U8e0Y2u---"
},
{
"_key": "bob",
"_id": "persons/bob",
"_rev": "_U8ezwCm---"
}
]
},
{
"depth": 2,
"foaf": [
{
"_key": "charlie",
"_id": "persons/charlie",
"_rev": "_U8e0-Oe---"
},
{
"_key": "eve",
"_id": "persons/eve",
"_rev": "_U8e0loy---"
},
{
"_key": "alice",
"_id": "persons/alice",
"_rev": "_U8e0ptu---"
}
]
}
]
}
]
更新
如果需要有关人员之间关系的更多信息,可以返回路径而不是顶点。路径(p
)包括所有访问的边(知道关系)和所有顶点(人)。
有关AQL遍历语法的更多信息:请参阅
谢谢你的回答。不幸的是,我的图形图像最初并没有显示“亨利”,他是露西的二级朋友。我已经更新了原始图像。我想知道两件事。通过您的查询,它向我显示了深度,这很好,但我如何显示哪些朋友属于Bob,哪些朋友属于Lucy?其次,伊芙是鲍勃和露西的二等朋友。还有什么可以展示的吗?基本上,我想显示所有的二级朋友,但向请求的用户显示他们有哪些共同的一级朋友(有时会不止一个像上面那样),谢谢你的回答。不幸的是,我的图形图像最初并没有显示“亨利”,他是露西的二级朋友。我已经更新了原始图像。我想知道两件事。通过您的查询,它向我显示了深度,这很好,但我如何显示哪些朋友属于Bob,哪些朋友属于Lucy?其次,伊芙是鲍勃和露西的二等朋友。还有什么可以展示的吗?基本上,我想显示所有的二级好友,但向请求用户显示他们有哪些共同的一级好友(有时会不止一个)