В этом примере показано, как искать социальное окружение, чтобы найти друзей второй степени человека, с помощью интерфейса MATLAB® для Neo4j®. Примите, что у вас есть данные о графике, которые хранятся на базе данных Neo4j, которая представляет социальное окружение. Эта база данных имеет семь узлов и восемь отношений. Каждый узел имеет только один ключ name
уникального свойства со значением в пределах от
User1
через User7
. Каждое отношение имеет, вводят knows
.
Найти друзей второй степени User1
, используйте интерфейс MATLAB для Neo4j и digraph
объект. Для получения дополнительной информации об интерфейсе MATLAB к Neo4j, смотрите Рабочий процесс Базы данных Графика для Интерфейсов БД Neo4j.
Локальная машина размещает базу данных Neo4j с номером порта 7474
, имя пользователя neo4j
, и пароль matlab
. Для визуального представления данных в базе данных смотрите этот рисунок.
Создайте объект 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)
neo4j
| searchNode
| searchRelation
| successors
| unique
| setdiff