Main Content

Add and Query Group of Colleagues in Social Neighborhood

This example shows how to add a group of colleagues, stored as a directed graph, to a group of friends in a social neighborhood, stored as nodes and relationships in a Neo4j® database. The example then shows how to query the graph in the database by using the Cypher® query language, which enables you to create custom queries.

For details about the MATLAB® interface to Neo4j, see Graph Database Workflow for Neo4j Database Interfaces.

Assume that you have graph data stored in a Neo4j database that represents the 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 the type knows.

The local machine hosts the Neo4j database with the port number 7474, user name neo4j, and password matlab. This figure provides a visual representation of the data in the database.

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 =

     []

Create Directed Graph

Define a group of four colleagues by creating a directed graph in MATLAB. Create a digraph object that has four nodes and three edges.

s = [1 1 1];
t = [2 3 4];
G = digraph(s,t);

Specify names for the nodes.

G.Nodes.name = {'User8';'User9';'User10';'User11'};

Plot the digraph to view the nodes and edges.

plot(G)

Store Directed Graph in Neo4j Database

Store the directed graph as a Neo4j graph. Specify two labels for all nodes in the resulting Neo4j graph by using the GlobalNodeLabel name-value pair argument. Also, specify the type works with for all relationships in the resulting Neo4j graph by using the GlobalRelationType name-value pair argument.

graphinfo = storeDigraph(neo4jconn,G, ...
    'GlobalNodeLabel',{'Colleague','Person'}, ...
    'GlobalRelationType','works with');

Display the node labels of the first node in the graph.

graphinfo.Nodes.NodeLabels{1}
ans = 2×1 cell array
    {'Person'   }
    {'Colleague'}

The result is a cell array of character vectors. Each character vector is a node label for the first node.

Display the relationships in the graph.

graphinfo.Relations
ans=3×5 table
          StartNodeID    RelationType    EndNodeID    RelationData                RelationObject             
          ___________    ____________    _________    ____________    _______________________________________

    20        31         'works with'        8        [1×1 struct]    [1x1 database.neo4j.http.Neo4jRelation]
    23        31         'works with'       32        [1×1 struct]    [1x1 database.neo4j.http.Neo4jRelation]
    24        31         'works with'       33        [1×1 struct]    [1x1 database.neo4j.http.Neo4jRelation]

Relations is a table that contains these variables:

  • Start node identifier

  • Relationship type

  • End node identifier

  • Relationship data

  • Neo4jRelation object

Connect Group of Colleagues to Friends in Existing Graph

Search for the nodes with the node label Person and the property key name set to the values User7 and User8 by using the Neo4j database connection.

nlabel = 'Person';
user7 = searchNode(neo4jconn,nlabel,'PropertyKey','name', ...
    'PropertyValue','User7');
user8 = searchNode(neo4jconn,nlabel,'PropertyKey','name', ...
    'PropertyValue','User8');

Add a relationship between the nodes User7 and User8 to connect the group of colleagues to the group of friends.

relationtype = 'knows';
relation = createRelation(neo4jconn,user7,user8,relationtype);

Display the resulting graph in the Neo4j database.

Execute Cypher Query on Neo4j Database

Create a Cypher query to find the people who work with people User7 knows. Display the names of those people.

query = ['MATCH (:Person {name: "User7"})-[:knows]->(:Person)-[:`works with`]' ...
    '->(potentialContact:Person) RETURN potentialContact.name'];
results = executeCypher(neo4jconn,query)
results=3×1 table
    potentialContact_name
    _____________________

          'User11'       
          'User10'       
          'User9'        

User9, User10, and User11 all work with someone that User7 knows. User7 knows User8, who works with User9, User10, and User11.

Close Database Connection

close(neo4jconn)

See Also

|

Related Topics

External Websites