Arangodb 遍历以包含头部顶点
Arangodb traversal to include head vertex
我正在使用 GRAPH_TRAVERSAL 获取从节点列表到树头的路径。这非常有效,除非示例恰好是树的头部。在这种情况下,edgeCollection 没有此对象的入站条目,因此它不会出现在结果中。
FOR v IN GRAPH_TRAVERSAL('gdp2',
[{_id:'pmsite/14419285155'}],
'inbound',{edgeCollection:'child'})
RETURN v
结果是一个空列表:[]
有什么办法可以保证起始节点在列表中吗?通过示例列表来区分哪些位于树的头部是一件很痛苦的事情。
问题出在查询本身。它包含一个难以发现的细微错误:
[{_id:pmsite/14419285155}],
缺少 pmsite/14419285155
周围的引号。
这个查询真正做的是通过 id 14419285155
划分(可能是计数)集合 pmsite
并将其作为 {_id: divcount}
.
如果添加遗漏的引号,查询应该完全符合您的要求。 (编辑:原始查询中存在引号,修复了 post。)
提示:db._explain()
提供了相关信息。
正在尝试重现,使用 knows sample graph:
arangosh> var examples = require("org/arangodb/graph-examples/example-graph.js");
arangosh> var g = examples.loadGraph("knows_graph");
arangosh> db._query("FOR e IN GRAPH_TRAVERSAL('knows_graph', [{_id: 'persons/eve'}], 'inbound', {edgeCollection: 'knows'}) return e").toArray()
[
[
{
"vertex" : {
"_id" : "persons/eve",
"_rev" : "1405497100114",
"_key" : "eve",
"name" : "Eve"
}
}
]
]
然而,创建有点类似行为的是使用不属于图形定义的集合:
arangosh> db._create("othercol")
arangosh> db.othercol.save({_key: "1" })
arangosh> db._query("FOR e IN GRAPH_TRAVERSAL('knows_graph', [{_id: 'othercol/1'}], 'inbound', {edgeCollection: 'knows'}) return e").toArray()
[ ]
正如评论中所指出的,边缘关系是有方向的。如果你想让边指向两个方向,你需要在另一个方向上创建第二个关系。不完全填充边缘定义的边缘可能会被忽略。
我正在使用 GRAPH_TRAVERSAL 获取从节点列表到树头的路径。这非常有效,除非示例恰好是树的头部。在这种情况下,edgeCollection 没有此对象的入站条目,因此它不会出现在结果中。
FOR v IN GRAPH_TRAVERSAL('gdp2',
[{_id:'pmsite/14419285155'}],
'inbound',{edgeCollection:'child'})
RETURN v
结果是一个空列表:[]
有什么办法可以保证起始节点在列表中吗?通过示例列表来区分哪些位于树的头部是一件很痛苦的事情。
问题出在查询本身。它包含一个难以发现的细微错误:
[{_id:pmsite/14419285155}],
缺少 pmsite/14419285155
周围的引号。
这个查询真正做的是通过 id 14419285155
划分(可能是计数)集合 pmsite
并将其作为 {_id: divcount}
.
如果添加遗漏的引号,查询应该完全符合您的要求。 (编辑:原始查询中存在引号,修复了 post。)
提示:db._explain()
提供了相关信息。
正在尝试重现,使用 knows sample graph:
arangosh> var examples = require("org/arangodb/graph-examples/example-graph.js");
arangosh> var g = examples.loadGraph("knows_graph");
arangosh> db._query("FOR e IN GRAPH_TRAVERSAL('knows_graph', [{_id: 'persons/eve'}], 'inbound', {edgeCollection: 'knows'}) return e").toArray()
[
[
{
"vertex" : {
"_id" : "persons/eve",
"_rev" : "1405497100114",
"_key" : "eve",
"name" : "Eve"
}
}
]
]
然而,创建有点类似行为的是使用不属于图形定义的集合:
arangosh> db._create("othercol")
arangosh> db.othercol.save({_key: "1" })
arangosh> db._query("FOR e IN GRAPH_TRAVERSAL('knows_graph', [{_id: 'othercol/1'}], 'inbound', {edgeCollection: 'knows'}) return e").toArray()
[ ]
正如评论中所指出的,边缘关系是有方向的。如果你想让边指向两个方向,你需要在另一个方向上创建第二个关系。不完全填充边缘定义的边缘可能会被忽略。