Omega Strikers: Guide to Gear and Awakenings with Apache AGE
Tags: apacheage, postgres, omegastrikers, learning
Published: 2023-05-17 21:50:30

## **Introduction**
In today's article, I will begin by introducing Apache AGE and the game Omega Strikers. Following that, I will create a small graph to illustrate select data from the game. Finally, I will provide a conclusion summarizing the insights gained from this showcase.
## **What is Apache AGE**
Apache AGE is a PostgreSQL extension that provides graph database functionality. AGE is an acronym for A Graph Extension, and is inspired by Bitnine’s fork of PostgreSQL 10, AgensGraph, which is a multi-model database. The goal of the project is to create single storage that can handle both relational and graph model data so that users can use standard ANSI SQL along with openCypher, the Graph query language.
Read more about Apache AGE here: https://age.apache.org/
Contribute to the Github repository: https://github.com/apache/age

## **What is Omega Strikers**
Omega Strikers is a cross-platform game that offers an action-packed sports experience. In this game, you can play as a forward (also known as an attacker) or a goalie in a 3 versus 3 arena. The objective is to score goals while also trying to knock out your opponents. It is a free-to-play game available on PC, Nintendo Switch, PlayStation, Xbox, iOS, and Android platforms.
In this game, players have the option to choose awakenings and gears that serve as special powers for their strikers (characters). In today's article, I will create two builds for the striker Juliette and present them in an Apache AGE graph format.

There are more than 30 awakenings in the game, so I won't show them all. However, here you can see all the available gears in Omega Strikers, as there are only 8:
![All gears available in Omega Strikers](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u00iykn82pgeordtz7p2.png)



## **Graph Creation and Visualization**
First and foremost, we need to create our graph. Let's name it `omega_strikers`:
`SELECT create_graph('omega_strikers');`

Now, let's **create our vertices**. First, the striker:
`SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Striker)
SET a.name = 'Juliette'
$$) AS (a agtype);`
Next, the gear:
`SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Gear {name: 'Magnetic Soles', description: 'Crossing midfield grants 30% speed for 1s'})
$$) AS (a agtype);`
Moving on to the awakenings:
`SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'One-Two Punch', description: 'Hit 25% harder (5% to core) against targets you\'ve hit within 2.5s'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'Built Different', description: 'Gain 40% size and your impact abilities hit 15% harder (3% to core)'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'Perfect Form', description: 'Hits reduce other ability cooldowns by 12% up to 1.2s per hit (4%/.4s for light hits)'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'Big Fish', description: 'Gain 40% size and 300 max stagger'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'Peak Performance', description: 'Gain 250 max stagger and 0.007% speed per 100 max stagger'})
$$) AS (a agtype);`
Lastly, let's create the vertex for the build:
`SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Build {name: 'Meta Forward'})
$$) AS (a agtype);`

Now, let's **create the relationships** by creating the edges:
`SELECT * FROM cypher('omega_strikers', $$
MATCH (n:Build), (m:Gear)
CREATE (n)<-[a:Recommended]-(m)
RETURN a
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
MATCH (n:Build), (m:Awakening)
CREATE (n)<-[a:Recommended]-(m)
RETURN a
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
MATCH (n:Build), (m:Striker)
CREATE (n)-[a:Recommended]->(m)
RETURN a
$$) AS (a agtype);`
Notice that we don't need to use the WHERE clause because we only have the gear, awakenings, striker, and build nodes that we want to create relationships with. Let's take a look at the graph:
![Graph visualization of the relationships with 1 striker, 1 build, 5 awakenings and 1 gear](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ghwmzmhodg81rx9mynjw.png)
Futhermore, we could add another build, for that we need to create some other vertices for awakenings and gear too. Here's the code:
`SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Gear {name: 'Vicious Vambrace', description: 'Restore stagger equal to 25% of the damage you deal (reduced on core)'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'Bulk Up', description: 'Gain 250 max stagger and 1.5 power per 100 max stagger'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Awakening {name: 'Tempo Swing', description: 'Hitting anything heals you for 4% of your max stagger (1.33% for light hits) and deals that amount as damage to the target hit.'})
$$) AS (a agtype);`
Next, we create the vertex for the `Tank/Bruiser Forward` build and establish the corresponding edges:
`SELECT * FROM cypher('omega_strikers', $$
CREATE (a:Build {name: 'Tank/Bruiser Forward'})
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
MATCH (n:Build), (m:Gear)
WHERE n.name = 'Tank/Bruiser Forward' AND m.name = 'Vicious Vambrace'
CREATE (n)<-[a:Recommended]-(m)
RETURN a
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
MATCH (n:Build), (m:Awakening)
WHERE n.name = 'Tank/Bruiser Forward' AND (m.name = 'Big Fish' OR m.name='One-Two Punch' OR m.name = 'Bulk Up' OR m.name = 'Tempo Swing' OR m.name = 'Peak Performance')
CREATE (n)<-[a:Recommended]-(m)
RETURN a
$$) AS (a agtype);
SELECT * FROM cypher('omega_strikers', $$
MATCH (n:Build), (m:Striker)
WHERE n.name = 'Tank/Bruiser Forward' AND m.name = 'Juliette'
CREATE (n)-[a:Recommended]->(m)
RETURN a
$$) AS (a agtype);`
Now, let's take a look at how the graph looks like:
![Graph with 1 striker, 2 builds, 7 awakenings and 2 gears](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gaugu77upbcgx3dhwwby.png)

## **Conclusion**
We can utilize Apache AGE for various purposes, such as analyzing data from a game. This includes examining insights like player counts, gaming hours, and other related factors if we had a larger database containing all the players' and matches' data.
Additionally, we can explore, as we did, how the powers in the game, such as awakenings and gears, establish relationships with different types of builds (and possibily strikers). Apache AGE provides a versatile platform for conducting such analyses and gaining valuable insights.