В этом примере показано, как с помощью интерфейса MATLAB ® для Neo4j ® найти друзей второго уровня. Предположим, что имеются графические данные, которые хранятся в базе данных Neo4j, представляющей социальный район. Эта база данных имеет семь узлов и восемь взаимосвязей. Каждый узел имеет только один уникальный ключ свойстваname со значением в диапазоне от User1 через User7. Каждая связь имеет тип knows.
Чтобы найти друзей второй степени User1, используйте интерфейс MATLAB для Neo4j и digraph объект. Дополнительные сведения об интерфейсе MATLAB для Neo4j см. в разделе Рабочий процесс базы данных Graph для интерфейсов базы данных Neo4j.
На локальном компьютере размещена база данных Neo4j с номером порта 7474Имя пользователя neo4j, и пароль matlab. Визуальное представление данных в базе данных см. на этом рисунке.
Создание объекта Neo4j соединения neo4jconn с использованием URL-адреса http://localhost:7474/db/dataИмя пользователя neo4j, и пароль matlab.
url = 'http://localhost:7474/db/data'; username = 'neo4j'; password = 'matlab'; neo4jconn = neo4j(url,username,password);
Проверьте Message свойство объекта подключения Neo4j neo4jconn. Бланк Message указывает на успешное подключение.
neo4jconn.Message
ans =
[]
Поиск узла с меткой узла Person с именем свойства User1.
user1 = searchNode(neo4jconn,'Person','PropertyKey','name', ... 'PropertyValue','User1')
user1 =
Neo4jNode with properties:
NodeID: 0
NodeData: [1×1 struct]
NodeLabels: 'Person'
Поиск исходящих отношений для User1. Чтобы ограничить поиск связями с расстоянием не более двух, укажите 2 как значение аргумента пара имя-значение 'Distance'.
user1_relation = searchRelation(neo4jconn,user1,'out','Distance',2)
user1_relation = struct with fields:
Origin: 0
Nodes: [4×3 table]
Relations: [4×5 table]
Использование таблицы user1_relation.Nodes, доступ к name для каждого узла, который появляется в NodeData переменной таблицы.
Присвоение таблицы user1_relation.Nodes кому nodestable.
nodestable = user1_relation.Nodes
nodestable=4×3 table
NodeLabels NodeData NodeObject
__________ ____________ ___________________________________
0 'Person' [1×1 struct] [1x1 database.neo4j.http.Neo4jNode]
1 'Person' [1×1 struct] [1x1 database.neo4j.http.Neo4jNode]
2 'Person' [1×1 struct] [1x1 database.neo4j.http.Neo4jNode]
3 'Person' [1×1 struct] [1x1 database.neo4j.http.Neo4jNode]
Назначение имен строк для каждой строки в таблице nodestable кому rownames.
rownames = nodestable.Properties.RowNames
rownames = 4×1 cell array
{'0'}
{'1'}
{'2'}
{'3'}
Доступ к NodeData переменная из nodestable для каждой строки. nodedata содержит массив структур.
nodedata = [nodestable.NodeData{rownames}]nodedata = 1×4 struct array with fields:
name
Чтобы получить name поле из каждой структуры, индексировать в массив. nodenames - массив ячеек символьных векторов, содержащий имена узлов.
nodenames = {nodedata(:).name}nodenames = 1×4 cell array
{'User1'} {'User3'} {'User2'} {'User4'}
Создать digraph объект user1_graph с использованием neo4jStruct2Digraph функция с данными взаимосвязи, сохраненными в user1_relation и имена узлов, сохраненные в nodenames.
user1_graph = neo4jStruct2Digraph(user1_relation,'NodeNames',nodenames)user1_graph =
digraph with properties:
Edges: [4×3 table]
Nodes: [4×3 table]
Чтобы увидеть визуальное представление графика, создайте фигуру, которая отображает user1_graph.
plot(user1_graph,'EdgeLabel',user1_graph.Edges.RelationType)
Получение списка всех друзей первой степени User1. user1_friend variable - массив ячеек векторов символов, содержащий имена друзей первой степени.
disp('Friends of User1 are:')Friends of User1 are:
user1_friend = successors(user1_graph,'User1')user1_friend = 2×1 cell array
{'User3'}
{'User2'}
Чтобы найти друзей второй степени User1, выполнить successors снова зациклившись на списке друзей первой степени. user1_friends_friend - клеточный массив символьных векторов, содержащий имена друзей второй степени.
user1_friends_friend = {};
for i = 1:length(user1_friend)
user1_friends_friend = [user1_friends_friend; ...
successors(user1_graph,user1_friend{i})];
end
disp('Friends of User1''s friends are:')Friends of User1's friends are:
user1_friends_friend = unique(user1_friends_friend)
user1_friends_friend = 2×1 cell array
{'User3'}
{'User4'}
Удаление дубликатов из списка друзей второго уровня, которые уже есть в списке друзей первого уровня, с помощью setdiff.
finalResult = setdiff(user1_friends_friend,user1_friend);
disp('User1''s second-degree friends are:')User1's second-degree friends are:
for i = 1:length(finalResult) disp(finalResult{i}) end
User4
finalResult - клеточный массив символьных векторов, содержащий имена друзей второй степени. Этот список удаляет имена друзей первой степени.
close(neo4jconn)
neo4j | searchNode | searchRelation | setdiff | successors | unique