我正在尝试获取出演电影最多的十个人,并按降序排列电影的名称和数量。我正在使用IMDB dataset .
这是我到目前为止所拥有的:
arangosh [_system]> var Graph = require("org/arangodb/graph").Graph;
arangosh [_system]> var db = require("org/arangodb").db;
arangosh [_system]> statement = db._createStatement({query: 'FOR vert IN imdb_vertices FILTER vert.type == "Person" LET edge_count = (LENGTH(EDGES(imdb_edges, vert, "outbound", [{type: "ACTS_IN"}]))) RETURN {"name": vert.name, "count": edge_count}'})
[object ArangoStatement]
arangosh [_system]> cursor = statement.execute()
[object ArangoQueryCursor]
arangosh [_system]> cursor.next()
{
"name" : "Stephanie Faracy",
"count" : 0
}
如何使用 AQL 做到这一点?
最佳答案
没有索引:以下将返回前 10 名:
arangosh [_system]> db._createStatement({query: 'FOR vert IN imdb_vertices FILTER vert.type == "Person" LET edge_count = (LENGTH(EDGES(imdb_edges, vert, "outbound", [{"type": "Role", "$label": "ACTS_IN"}]))) SORT edge_count DESC LIMIT 10 RETURN {"name": vert.name, "count": edge_count}'}).execute().toArray()
[
{
"name" : "Clint Eastwood",
"count" : 148
},
{
"name" : "Claude Jade",
"count" : 142
},
{
"name" : "Samuel L. Jackson",
"count" : 122
},
{
"name" : "Armin Mueller-Stahl",
"count" : 112
},
{
"name" : "Gérard Depardieu",
"count" : 104
},
{
"name" : "Marisa Mell",
"count" : 104
},
{
"name" : "Robert De Niro",
"count" : 104
},
{
"name" : "Bruce Willis",
"count" : 96
},
{
"name" : "Jackie Chan",
"count" : 94
},
{
"name" : "Michael Caine",
"count" : 90
}
]
基本上,您也可以对使用 LET 创建的变量使用“排序”。 Limit 允许您限制为 TOP 10。请注意,顶点中的类型是“Role”,标签是“ACTS_IN”。
将数字添加到文档并使用排序索引会更有效。但这需要更新文档。
arangosh [_system]> c = db._createStatement({query: 'FOR vert IN imdb_vertices FILTER vert.type == "Person" LET edge_count = (LENGTH(EDGES(imdb_edges, vert, "outbound", [{"type": "Role", "$label": "ACTS_IN"}]))) RETURN {"_key": vert._key, "count": edge_count}'}).execute()
[object ArangoQueryCursor]
arangosh [_system]> while (c.hasNext()) { var d = c.next(); db.imdb_vertices.update(d._key, {COUNT: d.count}); }
arangosh [_system]> db.imdb_vertices.ensureSkiplist("COUNT");
arangosh [_system]> x = db._createStatement({query: 'FOR vert in imdb_vertices FILTER vert.COUNT >= 0 SORT vert.COUNT DESC LIMIT 10 RETURN vert'}).execute()
[object ArangoQueryCursor]
关于graph - 如何按传入边数进行计数和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23400855/