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

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

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

Локальный компьютер размещает базу данных 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. The 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)

См. также

| | | | |

Похожие примеры

Подробнее о