Хорошая база данных графиков для поиска пересечений (Neo4j? Pegasus? Allegro?…)

#database #intersection #neo4j #graph-databases

#База данных #пересечение #neo4j #графические базы данных

Вопрос:

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

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

Комментарии:

1. Я предполагаю, что вам нужны ответы только на основе GraphDB, но такого рода пересечение множеств — это именно то, на что ориентирована реляционная база данных (т. Е. вычисления на основе множеств)

Ответ №1:

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

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

Ответ №2:

Это сообщит вам, есть ли соединение:

 Node from_node = index.get("guid", "user_a").getSingle();
Node to_node = index.get("guid", "user_b").getSingle();
if(from_node != null amp;amp; 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 amp;amp; 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 в консоли сервера Neo4J (отличный способ поиграть с Neo4J после заполнения базы данных):

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

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