# Graph Data Modeling

In this section we will take our example social media app and see how it could be modeled in a graph.

The concept of modeling data in a graph starts by placing dots, which represent nodes. Nodes can have one or more predicates (properties). A `person` may have predicates for their name, age, and gender. A `post` might have a predicate value showing when it was posted, and a value containing the contents of the post. A `comment` would most likely have a predicate containing the comment string. However, any one node could have other predicates that are not contained on any other node. Each node represents an individual item, hence the singular naming structure.

As graphs naturally resemble the data you are modeling, the individual nodes can be moved around this conceptual space to clearly show the relationships between these data nodes. Relationships are formed in graphs by creating an edge between them. In our app, a post has an author, a post can have comments, a comment has an author, and a comment can have a reply.

For sake of illustration we will also show the family tree information. The `father` and the `mother` are linked together with a `spouse` edge, and both parents are related to the child along a `child` edge.

With a graph, you can also name the inverse relations. From here we can quickly see the inverse relationships. A `Post` has an `Author` and a `Person` has `Posts`. A `Post` has `Comments` and a `Comment` is on a `Post`. A `Comment` has an `Author`, and a `Person` has `Comments`. A `Parent` has a `Child`, and a `Child` has a `Parent`.

You create many-to-many relationships in the same way that you make one-to-many relationships, with an edge between nodes.

Adding groups of related data occurs naturally within a graph. The data is sent as a complete object instead of separate pieces of information that needs to be connected afterwards. Adding a new person and a new post to our graph is a one-step process. New data coming in does not have to be related to any existing data. You can insert this whole data object with 3 people, a post, and a comment; all in one step.

When new data is added to the model, the model will change to accept the data. Every change to a graph model is received naturally. When you add a new node with a data type, you are simply creating a new dot in space and applying a type to it. The new node does not include any predicates or relationships other than what you define for it. When you want to add a new predicate onto an existing data type, the model changes and adds the new property onto the items that you define. Other items not specifically given the new property type are not changed. When you add a new data type to the database, a new node is created, ready to receive new edges and predicates.

The key to remember when modeling a graph is to focus on the relationships between nodes. In a graph you can change the model without affecting the underlying data. Because the graph is stored as individual nodes, you can adjust predicates of individual nodes, create edges between sets of nodes, and add new node types without affecting any of the other nodes.

Turn on the lights