Хорошая графическая база данных для поиска пересечений (Neo4j? Pegasus? Allegro? ...) - PullRequest
4 голосов
/ 06 мая 2011

Я ищу хорошую базу данных графа для нахождения пересечений множества - беря любые два узла и проверяя, перекрываются ли их конечные точки.Аналогия с социальной сетью - два взгляда на двух людей и выяснение, связаны ли они с одними и теми же людьми.

Я пытался заставить работать FlockDB (от людей из Twitter), потому что встроены функции пересечения, но обнаружил, что не так много с точки зрения сообщества пользователей / поддержки.Таким образом, какие-либо рекомендации других графовых баз данных, особенно там, где я уже ищу нужную функцию пересечения ...?

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Разве это не самые короткие пути между двумя узлами с длиной == 2?

В Neo4j вы можете использовать для этого поиск shorttestPath () из GraphAlgoFactory .

1 голос
/ 19 июля 2011

Это скажет вам, если есть соединение:

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 (взят из Cheet Sheet на консоли сервера Neo4J (отличный способ играть с Neo4J после заполнения базы данных):

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

Это даст вам список узлов, совместно используемых для других отключенных узлов. Вы можете передать этот запрос встроенному серверу, например классу CypherParser.

...