exponenta event banner

Найти друзей в социальном районе

В этом примере показано, как с помощью интерфейса MATLAB ® для Neo4j ® найти друзей второго уровня. Предположим, что имеются графические данные, которые хранятся в базе данных Neo4j, представляющей социальный район. Эта база данных имеет семь узлов и восемь взаимосвязей. Каждый узел имеет только один уникальный ключ свойстваname со значением в диапазоне от User1 через User7. Каждая связь имеет тип knows.

Чтобы найти друзей второй степени User1, используйте интерфейс MATLAB для Neo4j и digraph объект. Дополнительные сведения об интерфейсе MATLAB для Neo4j см. в разделе Рабочий процесс базы данных Graph для интерфейсов базы данных Neo4j.

На локальном компьютере размещена база данных Neo4j с номером порта 7474Имя пользователя neo4j, и пароль matlab. Визуальное представление данных в базе данных см. на этом рисунке.

Подключиться к базе данных Neo4j

Создание объекта 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)

См. также

| | | | |

Связанные примеры

Подробнее