mongodb で mapreduce を使用して pagerank を実行しようとしています。
私のドキュメントは次の形式です。
{
"_id" : "u: 10000",
"value" : [
[
"u: 10000",
"s: 985272",
1
],
[
"s: 985272",
"u: 10000",
1
],
[
"u: 10000",
"s: 303770",
1
],
[
"s: 303770",
"u: 10000",
1
]
]
}
最初のステップは、キーごとにリンクを収集することだと思います。ただし、ドキュメントごとにいくつかのアウトバウンドリンクがあります。(これらはすべて双方向です)。
これが私のmapとreduce関数です:
m = function () {
for (var i = 0; i < this.value.length; i++){
var out = {};
out.out = this.value[i][1];
out.weight = this.value[i][2];
emit(this.value[i][0], [out]);
}
}
r = function(key, values){
var result = {
value: []
};
values.forEach(function(val) {
result.value.push({out: val.out, weight: val.weight});
});
return result;
}
問題は、emit がドキュメントごとに複数の排出量を生成していることがわからないことです。次のような結果が得られると:
{
"_id" : "s: 1000082",
"value" : [
{
"out" : "u: 37317",
"weight" : 1
}
]
}
ドキュメントごとに複数のアイテムが期待される場合。
誰にもアイデアはありますか?助けていただければ幸いです!
編集:
私は完全に満足していません。たとえば、このようなことはどのように機能しますか?. reduce の結果は、出力のようには見えません。