2013-10-23 74 views
0

我有一個UndirectedSparseGraph g,其中我存儲了兩種節點,即用戶和線程都擴展節點。對於用戶u,我希望檢索其2-dist鄰域,即與u鏈接的其他用戶,因爲它們對屬於你的1-dist鄰域的線程有邊緣。我知道KNeighborhoodFilter是從呼叫者節點檢索半徑爲「k」的節點的方式......這意味着,在我的情況下,1跳和2跳用戶都將返回,因此我必須過濾由此產生的集合。這是我到目前爲止:如何篩選KNeighborhoodFilter的結果?

// 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); 

我在這個方法的正確軌道?還是應該按照不同的模式來完成我的任務,即從選定用戶的距離中檢索用戶?

最好的問候, 西蒙娜

回答

1

你在做什麼工作,但您需要刪除原來的「根」節點爲好。

基本上,你有三種選擇: 1.做你現在正在做的事情。 2.編寫自己的代碼來收集一個集合中鄰居的鄰居。如果這是一個雙向圖,那麼你只需要刪除根目錄,就完成了。 這可能會更節省空間,因爲您創建的集合永遠不會比它大。 3.如果這是一個二分圖,請改爲使用超圖,其中節點是用戶,超分割是線程。然後你只需要超圖來獲取節點的鄰居。