1

私が持っているのは2つのテーブルです:

    Users (id, name, lastname) 
    Friends (id1, id2)

これらの2つのテーブルを考えると、2人のユーザー間の距離を見つけることができる必要がありますd(id1、id2)

テーブル内の各ユーザー属性を保持するUserクラスを定義しました。

グラフを作成する必要があります。グラフのデータ構造は

     Map<User, Set<User>>

ユーザーを一連の友達にマッピングします。グラフを作成するにはどうすればよいですか?db内のすべてのユーザーのIDをdbに照会しました。私は

   int[] userids

次に、この配列のintごとに:

(1)Userオブジェクトを作成し、そのユーザーの属性をデータベースにフェッチします

(2)データベース内のFriendsテーブルにクエリを実行して、そのユーザーの友達のIDを取得します。

    int [] friends

(3)このfriends配列の各intについて、dbにそのユーザーの属性をフェッチするUserオブジェクトを作成し、それに追加します。

    Set<User> friends = new Set<User>();

質問1:これをより良くする方法について何かアイデアはありますか?500人のユーザーがいて、Friendsテーブルに20000のエントリがあることを考えると、これには永遠に時間がかかります...

ここでの大きな問題は、2人のユーザーがデータベースで「同じ」である場合、それらが私のグラフの異なるオブジェクトで参照されることです。

これは私の距離アルゴリズムを台無しにしています。ユーザーuから始めて、彼の友達{f1、f2}を取得し、graph.get(f1)とgraph.get(f2)を使用して友達の友達を取得したい場合、nullになります(問題に記載されている理由により) 、つまり、多くの異なるUserオブジェクトの1 dbユーザー)

与えられた1人のユーザー(1、John、Doe)がヒープ内の唯一のUserオブジェクトで参照されるように、グラフを作成する方法を見つける必要があります...

質問2:どのように??

どうもありがとう

Javaグラフの実装を支援する

4

1 に答える 1

0

一度に1人のユーザーを読み取るのは遅くなり、データベースへのラウンドトリップが多くなります。テーブルにインデックスがない場合は特に遅くなりFriendsます。

データベースからすべてのデータを取得し、Javaでグラフを作成する方がよいでしょう。

select UserId, ... from Users;

Userあなたが今しているように、各ユーザーのためにを構築します。Map手順2で使用するfromからuserIdtoを作成する必要があります(同じオブジェクトに対してUser複数のオブジェクトを取得しないようにするため)。UseruserId

select id1, id2 from Friends;

次に、上記の2つのIDを検索し、それぞれを他方のアウトバウンドエッジセットMapに追加します。UserUser

于 2012-04-20T17:04:29.740 に答える