<youtube src="DoDaHmyIPvQ" />

# Links

- [GitHub](https://github.com/jrtechs/SteamFriendsGraph)
- [Live Site](http://steam.jrtechs.net/)

# Project Description

This project utilizes the steam API and graph databases to create friend graphs for clients in a 
web browser. Currently there are two types of graphs available:
- Friends of Friends Graph:
    This graph displays all the steam friends of a single person and all their friend’s friends.
- Common Friends Graph:
     This graph will only display your friends; however, it will draw edges between your friends’ if 
     they are friends with each other. 

# Motivation

While learning about graph databases I thought that it would be awesome to create a massive graph
database with steam friends in it. After a quick google search, I realized that some other people have 
done similar things in python, however, nobody has ever made a live website do this. Using my prior 
knowledge of the steam API and new knowledge of gremlin, Hadoop and HBase, I figured that this would 
be a great weekend project. Although I got most of the functionality done in the first weekend, I 
ended up working on it for 3 weekends hammering out all the edges. After ample work, I am satisfied with 
the appearance and functionality of the website, but, I am looking forward to making some improvements 
in the future.


![Lucid chart diagram](media/steam/diagram.png)

# Technical Details

At the core of this project there is a java backend and a JavaScript frontend. I needed a backend for
this project because you cannot distribute your steam API key, plus, this allows me to cache everything
in a local graph database. The second time a player is queried, it is extremely fast since all the steam 
friends are cached in a local
 [gremlin](http://tinkerpop.apache.org/docs/3.0.1-incubating/) server.
The only time-consuming operation that the backend must carry out is querying the steam API; querying the
 gremlin server is relatively fast.
On the front end I used [Sigma-JS](http://sigmajs.org/) with a web socket to render the steam graph.
Since creating a new graph on the back end can take up to 5 minutes (if the player has not been indexed), 
I continuously send new nodes to
the client as they arrive from the steam API. This prevents the client from staring at a loading bar
for 5 minutes; plus, it makes great time lapse videos. The only drawback to this is that you cannot
start applying a force to shake the graph until all the nodes are added to the graph. 

![Steam friends graph](media/steam/jrtechs1.png)

# Uses of Friends Graph Data Base
 
There are tons of [academic papers](http://infolab.stanford.edu/~ullman/mmds/ch10.pdf) 
written on the usages of friends’ graphs. What you may be able to do with friends 
graph may shock you. A popular use of friends’ graphs is to view friends’ clusters. Facebook may be able
 to identify someone's family, friends, and work groups by simply using their friend’s information. When looking
at steam friends graphs I could identify some people's high school and college friend’s groups. Another
famous example would be for friends’ identification; If a ton of people in your friends list are also
friends with a person, it is likely that they would also know that person. This is how 
websites like Snapchat, Instagram, and Facebook recommend people for you to follow. Similarly, you can
use this to identify people’s best friends. If two people share a ton of friends, it is 
more likely that they will be good friends vs the person which they only share one friend with.

Simple analysis of graphs like this may seem benign. However, there are tremendous implications when it
 comes to privacy and advertising. If websites chose to, they can harvest a ton of data and start 
 recommending you products based on not just what you like, but what your friends also like. Steam
already does this to a certain extent when they recommend you games that are popular among friends. 

![Steam friends graph](media/steam/ben2.png)

# Hosting the Project

Hosting the front end of this project is easy, it is just thrown on an apache server. The backend
is trickier since it needs to run both a java app and a gremlin server. Currently I am hosting this
project on an Ubuntu VM with 4gb ram. At idle this project only takes 1gb of ram, however, under heavy 
loads it uses around 2 GB of ram and saturates my CPU.

![Steam friends graph](media/steam/jrtechs2.png)

# Future Plans for the Project

In the future I would love to add more graphs to this website. Instead of just displaying graphs it would
also be cool to create pages which tries to identify friends’ groups, people you may know, and best
friends. There is a ton of game information available on the steam API, it might be neat to make
graphs based on friends who play the same games.