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

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

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

Локальная машина размещает базу данных Neo4j с номером порта 7474, имя пользователя neo4j и пароль matlab. Для визуального представления данных в базе данных смотрите эту фигуру.

Соединитесь с базой данных Neo4j

Создайте объект neo4jconn связи Neo4j с помощью http://localhost:7474/db/data URL, имени пользователя neo4j и пароль matlab.

url = 'http://localhost:7474/db/data';
username = 'neo4j';
password = 'matlab';

neo4jconn = neo4j(url,username,password);

Проверяйте свойство Message объекта neo4jconn связи Neo4j. Пустое свойство 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 является массивом ячеек из символьных векторов, который содержит имена друзей первой степени.

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)

Смотрите также

| | | | |

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

Больше о