我正在尋找一個好的圖數據庫來查找集合交集 - 採用任意兩個節點並查看它們的邊緣端點是否「重疊」。社會網絡比喻將兩個人看兩個人,看他們是否連接到同一個人。查找交叉點的好圖數據庫(Neo4j?Pegasus?Allegro?...)
我試圖讓FlockDB(來自Twitter上的人)工作,因爲內置了交集函數,但發現用戶社區/支持方面沒有太多。因此,其他圖形數據庫的任何建議,尤其是在我正在尋找的相交功能類型中,是否已經存在......?
我正在尋找一個好的圖數據庫來查找集合交集 - 採用任意兩個節點並查看它們的邊緣端點是否「重疊」。社會網絡比喻將兩個人看兩個人,看他們是否連接到同一個人。查找交叉點的好圖數據庫(Neo4j?Pegasus?Allegro?...)
我試圖讓FlockDB(來自Twitter上的人)工作,因爲內置了交集函數,但發現用戶社區/支持方面沒有太多。因此,其他圖形數據庫的任何建議,尤其是在我正在尋找的相交功能類型中,是否已經存在......?
這不就是長度== 2的兩個節點之間的最短路徑嗎?
在Neo4j中,您可以使用GraphAlgoFactory的shortestPath()Finder。
這會告訴你,如果有一個連接:
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類。
我假設你只是在基於GraphDB的答案之後,但這種Set交集恰恰是關係數據庫所面向的東西(即基於集合的計算) – cdeszaq 2012-10-02 19:19:16