2011-05-06 58 views
4

我正在尋找一個好的圖數據庫來查找集合交集 - 採用任意兩個節點並查看它們的邊緣端點是否「重疊」。社會網絡比喻將兩個人看兩個人,看他們是否連接到同一個人。查找交叉點的好圖數據庫(Neo4j?Pegasus?Allegro?...)

我試圖讓FlockDB(來自Twitter上的人)工作,因爲內置了交集函數,但發現用戶社區/支持方面沒有太多。因此,其他圖形數據庫的任何建議,尤其是在我正在尋找的相交功能類型中,是否已經存在......?

+0

我假設你只是在基於GraphDB的答案之後,但這種Set交集恰恰是關係數據庫所面向的東西(即基於集合的計算) – cdeszaq 2012-10-02 19:19:16

回答

2

這不就是長度== 2的兩個節點之間的最短路徑嗎?

在Neo4j中,您可以使用GraphAlgoFactory的shortestPath()Finder。

1

這會告訴你,如果有一個連接:

Node from_node = index.get("guid", "user_a").getSingle(); 
Node to_node = index.get("guid", "user_b").getSingle(); 
if(from_node != null && to_node != null) { 
    RelationshipExpander expander = Traversal.expanderForAllTypes(Direction.BOTH); 
    PathFinder<Path> finder = GraphAlgoFactory.shortestPath(expander, 2); 
    if(finder.findSinglePath(from_node, to_node) != null) { 
    //Connected by at least 1 common friend 
    } else { 
    //Too far apart or not connected at all 
    } 
} 

這會告訴你誰是我們共同的朋友們:

Node from_node = index.get("guid", "user_a").getSingle(); 
Node to_node = index.get("guid", "user_b").getSingle(); 
if(from_node != null && to_node != null) { 
    RelationshipExpander expander = Traversal.expanderForAllTypes(Direction.BOTH); 
    PathFinder<Path> finder = GraphAlgoFactory.shortestPath(expander, 2); 
    Iterable<Path> paths = finder.findAllPaths(from_node, to_node); 
    if(paths != null) { 
    for(Path path : paths) { 
     Relationship relationship = path.relationships().iterator().next(); 
     Node friend_of_friend = relationship.getEndNode(); 
    } 
    } else { 
    //Too far apart or not connected at all 
    } 
} 

此代碼是有點粗糙,是爲了更容易在Cypher中表示(從Neo4J服務器控制檯的Cheet Sheet中取得(在您填充數據庫後用Neo4J玩的好方法):

START a = (user, name, "user_a") 
MATCH (a)-[:FRIEND]->(friend)-[:FRIEND]->(friend_of_friend) 
RETURN friend_of_friend 

這會給你一個在另外斷開的節點之間共享的節點列表。您可以將此查詢傳遞給一個嵌入式服務器,該服務器被認爲是CypherParser類。