#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.