Find Friends of Friends in Social Neighborhood
This example shows how to search a social neighborhood to find the second-degree friends of a person, using the MATLAB® interface to Neo4j®. Assume that you have graph data that is stored on a Neo4j database which represents a social neighborhood. This database has seven nodes and eight relationships. Each node has only one unique property key name
with a value ranging from User1
through User7
. Each relationship has type knows
.
To find the second-degree friends of User1
, use the MATLAB interface to Neo4j and the digraph
object. For details about the MATLAB interface to Neo4j, see Graph Database Workflow for Neo4j Database Interfaces.
The local machine hosts the Neo4j database with port number 7474
, user name neo4j
, and password matlab
. For a visual representation of the data in the database, see this figure.
Connect to Neo4j Database
Create a Neo4j connection object neo4jconn
using the URL http://localhost:7474/db/data
, user name neo4j
, and password matlab
.
url = 'http://localhost:7474/db/data'; username = 'neo4j'; password = 'matlab'; neo4jconn = neo4j(url,username,password);
Check the Message
property of the Neo4j connection object neo4jconn
. The blank Message
property indicates a successful connection.
neo4jconn.Message
ans = []
Search for One Person in Database
Find the node that has the node label Person
with the property name User1
.
user1 = searchNode(neo4jconn,'Person','PropertyKey','name', ... 'PropertyValue','User1')
user1 = Neo4jNode with properties: NodeID: 0 NodeData: [1×1 struct] NodeLabels: 'Person'
Search for All Second-Degree Friends of Person
Find outgoing relationships for User1
. To limit the search to relationships with a distance of two or less, specify 2
as the value of the name-value pair argument 'Distance'
.
user1_relation = searchRelation(neo4jconn,user1,'out','Distance',2)
user1_relation = struct with fields:
Origin: 0
Nodes: [4×3 table]
Relations: [4×5 table]
Convert Graph Data to Directed Graph
Using the table user1_relation.Nodes
, access the name
property for each node that appears in the NodeData
variable of the table.
Assign the table user1_relation.Nodes
to 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]
Assign the row names for each row in the table nodestable
to rownames
.
rownames = nodestable.Properties.RowNames
rownames = 4×1 cell array
{'0'}
{'1'}
{'2'}
{'3'}
Access the NodeData
variable from nodestable
for each row. nodedata
contains an array of structures.
nodedata = [nodestable.NodeData{rownames}]
nodedata = 1×4 struct array with fields:
name
To retrieve the name
field from each structure, index into the array. nodenames
is a cell array of character vectors that contains node names.
nodenames = {nodedata(:).name}
nodenames = 1×4 cell array
{'User1'} {'User3'} {'User2'} {'User4'}
Create the digraph
object user1_graph
using the neo4jStruct2Digraph
function with the relationship data stored in user1_relation
and the node names stored in nodenames
.
user1_graph = neo4jStruct2Digraph(user1_relation,'NodeNames',nodenames)
user1_graph = digraph with properties: Edges: [4×3 table] Nodes: [4×3 table]
To see a visual representation of the graph, create a figure that displays user1_graph
.
plot(user1_graph,'EdgeLabel',user1_graph.Edges.RelationType)
Find Friends of Person
Retrieve a list of all the first-degree friends of User1
. The user1_friend
variable is a cell array of character vectors that contains the names of first-degree friends.
disp('Friends of User1 are:')
Friends of User1 are:
user1_friend = successors(user1_graph,'User1')
user1_friend = 2×1 cell array
{'User3'}
{'User2'}
Find Second-Degree Friends
To find the second-degree friends of User1
, run successors
again by looping through the list of the first-degree friends. user1_friends_friend
is a cell array of character vectors that contains the names of second-degree friends.
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'}
Remove Duplicate Friends
Remove duplicates from the second-degree friends list that are already in the first-degree friends list using 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
is a cell array of character vectors that contains the names of second-degree friends. This list removes the names of the first-degree friends.
Close Database Connection
close(neo4jconn)
See Also
neo4j
| searchNode
| searchRelation
| successors
| unique
| setdiff