Найти кратчайший путь между людьми в социальном соседстве

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

Чтобы найти кратчайший путь между User1 и User7, используйте интерфейс 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 узлы и все связи, связанные с каждым Person узел, использующий searchGraph.

social_graphdata = searchGraph(neo4jconn,{'Person'})
social_graphdata = struct with fields:
        Nodes: [7×3 table]
    Relations: [8×5 table]

Преобразуйте графовые данные в ориентированный график

Использование таблицы social_graphdata.Nodes, доступ к name свойство для каждого узла, который появляется в NodeData переменная таблицы.

Назначьте таблицу social_graphdata.Nodes на nodestable.

nodestable = social_graphdata.Nodes
nodestable=7×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]
    4     'Person'     [1×1 struct]    [1x1 database.neo4j.http.Neo4jNode]
    5     'Person'     [1×1 struct]    [1x1 database.neo4j.http.Neo4jNode]
    9     'Person'     [1×1 struct]    [1x1 database.neo4j.http.Neo4jNode]

Присвойте имена строк для каждой строки в таблице nodestable на rownames.

rownames = nodestable.Properties.RowNames
rownames = 7×1 cell array
    {'0'}
    {'1'}
    {'2'}
    {'3'}
    {'4'}
    {'5'}
    {'9'}

Доступ к NodeData переменная от nodestable для каждой строки. nodedata содержит массив структур.

nodedata = [nodestable.NodeData{rownames}]
nodedata = 1×7 struct array with fields:
    name

Как извлечь name поле из каждой структуры, индекс в массив. nodenames - массив ячеек из векторов символов, содержащий имена узлов.

nodenames = {nodedata(:).name}
nodenames = 1×7 cell array
    {'User1'}    {'User3'}    {'User2'}    {'User4'}    {'User5'}    {'User6'}    {'User7'}

Создайте digraph social_graph объекта использование neo4jStruct2Digraph функция с графиками, хранящимися в social_graphdata и имена узлов, хранящиеся в nodenames.

social_graph = neo4jStruct2Digraph(social_graphdata,'NodeNames',nodenames)
social_graph = 
  digraph with properties:

    Edges: [8×3 table]
    Nodes: [7×3 table]

Чтобы увидеть визуальное представление графика, создайте рисунок, которая отображает social_graph.

plot(social_graph,'EdgeLabel',social_graph.Edges.RelationType)

Поиск кратчайшего пути

Найдите кратчайший путь между User1 и User7 использование shortestpath.

[user1_to_user7,distance] = shortestpath(social_graph,'User1','User7')
user1_to_user7 = 1×5 cell array
    {'User1'}    {'User3'}    {'User4'}    {'User6'}    {'User7'}

distance = 4

Закрытие подключения к базе данных

close(neo4jconn)

См. также

| | |

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

Подробнее о