0

私は UndirectedSparseGraph g を持っており、そこには 2 種類のノード、つまりノードを拡張するユーザーとスレッドが格納されています。ユーザー u について、その 2 距離の近隣、つまり、u の 1 距離の近隣に属するスレッドにエッジがあるため、u とリンクしている他のユーザーを取得したいと思います。KNeighborhoodFilter は、呼び出し元ノードから「半径 k 内」のノードを取得する方法であることを知っています...これは、私の場合、1 ホップのスレッドと 2 ホップのユーザーの両方が返されることを意味するため、フィルタリングする必要があります。結果のコレクション。これは私がこれまでに持っているものです:

// filter users in 2-dist nei
Predicate<Node> onlyUsers = new Predicate<Node>() {
    @Override
    public boolean apply(Node node) {
        return node.getName().startsWith("u");
    }
};
// find neighbors of nodes with degree i
Filter<Node, Edge> filter = new KNeighborhoodFilter<Node, Edge>(u, 2, KNeighborhoodFilter.EdgeType.IN_OUT);
// retrieve the nodes - but here we have both types of nodes
Collection<Node> twoDistNei = filter.transform(g).getVertices();
// filter the collection to retain only threads
Collection<Node> twoDistUsers = Collections2.filter(twoDistNei, onlyUsers);

私はこのアプローチで正しい軌道に乗っていますか? または、選択したユーザーから距離 2 にあるユーザーを取得するというタスクを達成するために、別のパターンに従う必要がありますか?

よろしく、シモーネ

4

1 に答える 1

1

元の「ルート」ノードも削除する必要があることを除いて、あなたがしていることはうまくいきます。

基本的に、選択肢は 3 つあります。 1. 今していることを実行します。2. セット内の u の隣人の隣人を収集する独自のコードを記述します。これが 2 部グラフの場合は、ルートを削除するだけで完了です。構築するセットが必要以上に大きくなることはないため、これはおそらくよりスペース効率が良いでしょう。3. これが 2 部グラフの場合は、代わりにハイパーグラフを使用します。ここで、ノードはユーザーであり、ハイパーエッジはスレッドです。次に、ハイパーグラフにノードの隣接ノードを求めるだけです。

于 2013-10-23T15:58:18.997 に答える