🏆 Graph Challenge 2025 #1 [Ends March 27th at 5PM EST] – Win a cool Neo4j T-Shirt

Happy Monday Graph Enthusiasts!

As the new Community Manager at Neo4j, I’ve been seeing the world a little differently lately… through the lens of a graph database. While sipping my morning coffee at a local breakfast spot, I spotted this beautiful scene on the counter—and immediately thought: this could be a graph.

So here’s the challenge:
Can you create the most creative graph?

:mag: The Contest:
Use the image I snapped as your only input. Your goal is to model it as a graph—whatever that means to you. Get clever, get weird, get visual.

:scroll: Rules:
:spiral_calendar_pad: Submissions due Thursday @ 5PM EST
:pushpin: Submit by replying to this thread
Include your graph visualization
Share anything else that shows your thought process: Cypher queries, logic, data model sketches, whatever you like!
:tada: Most importantly… have fun with it!

:judge: Judging:
Our notorious "Neo-Judge" will review submissions and select a winner based on creativity, clarity, and graph-y goodness.

:sports_medal: Winner announced Friday @ 5PM EST

4 Likes

Maybe not the best graph, neither graph design nor just design but a fun little thrown together concept art anyway :person_shrugging:

3 Likes

Love it! Thank you so much for being entry #1 @therese.magnusson!

2 Likes

@gq16 / @kiranu.email - will you please resubmit your entries! :slight_smile:

The original setup did not allow for replies, but I believe I have fixed this/.

I hope this make sense too.

I started by creating a a dummy model with Neo4j arrow.

  • itemID is a unique ID for each product
  • Position indicates whether the item is on the edges or inside the bucket
  • natural indicates whether product flavour is natural (yes or no)
  • name is the flavour name e.g hazelnut.

I then transformed that into a graph model, populating details of 14 coffee mate products in the DB. The result is shown below.

1 Like

Love it! Thanks for the design and logic.

1 Like

Thank you for your feedback

1 Like

I will win that for sure, but not now! ;)

1 Like

Love it! Looking forward to seeing it. Tomorrow I will share the name of our notorious judge and the :t_shirt: for the winner!

CREATE (nestle:Brand {name: "Nestlé"})
CREATE (coffeeMate:Product {name: "Coffee Mate"})
CREATE (milkDerivative:Ingredient {name: "Milk Derivative"})
CREATE (shakeWell:Instruction {text: "Shake well"})
CREATE (noRefrigeration:Instruction {text: "No refrigeration needed"})
CREATE (artificial:FlavorType {name: "Artificial"})
CREATE (natural:FlavorType {name: "Natural"})
CREATE (artificialAndNatural:FlavorType {name: "Artificial and Natural"})
CREATE (company:Company {name: "Nestlé Professional"})
CREATE (region:Region {name: "North America"})
CREATE (city:City {name: "Solon"})
CREATE (state:State {name: "OH"})
CREATE (zip:ZipCode {code: "44139"})
CREATE (country:Country {name: "USA"})
CREATE (address:Address {description: "Distributed by Nestlé Professional, North America, Solon, OH 44139 USA"})

WITH coffeeMate, nestle, company, region, city, state, zip, country, address, milkDerivative, shakeWell, noRefrigeration, artificial, artificialAndNatural
CREATE (coffeeMate)-[:DISTRIBUTED_BY]->(company)
CREATE (coffeeMate)-[:BELONGS_TO]->(nestle)
CREATE (company)-[:LOCATED_IN]->(region)
CREATE (company)-[:LOCATED_IN]->(city)
CREATE (company)-[:LOCATED_IN]->(state)
CREATE (company)-[:HAS_ZIP_CODE]->(zip)
CREATE (company)-[:LOCATED_IN]->(country)
CREATE (coffeeMate)-[:HAS_DESCRIPTION]->(address)
CREATE (coffeeMate)-[:CONTAINS]->(milkDerivative)
CREATE (coffeeMate)-[:HAS_INSTRUCTION]->(shakeWell)
CREATE (coffeeMate)-[:HAS_INSTRUCTION]->(noRefrigeration)
CREATE (nestle)-[:MAKES]->(coffeeMate)

WITH coffeeMate, artificial, artificialAndNatural
CREATE (hazelnut:Flavor {name: "Hazelnut"})
CREATE (frenchVanilla:Flavor {name: "French Vanilla"})
CREATE (irishCreme:Flavor {name: "Irish Creme"})
CREATE (italianSweetCreme:Flavor {name: "Italian Sweet Creme"})

WITH coffeeMate, hazelnut, frenchVanilla, irishCreme, italianSweetCreme, artificial, artificialAndNatural
CREATE (yellowColor:Color {hex: "#ffcc00", name: "Yellow"})
CREATE (blueColor:Color {hex: "#0073e6", name: "Blue"})
CREATE (pinkColor:Color {hex: "#ffb397", name: "Pink"})
CREATE (greenColor:Color {hex: "#00ff96", name: "Green"})

WITH coffeeMate, hazelnut, frenchVanilla, irishCreme, italianSweetCreme, yellowColor, blueColor, pinkColor, greenColor, artificial, artificialAndNatural
CREATE (hazelnut)-[:HAS_COLOR]->(yellowColor)
CREATE (frenchVanilla)-[:HAS_COLOR]->(blueColor)
CREATE (irishCreme)-[:HAS_COLOR]->(greenColor)
CREATE (italianSweetCreme)-[:HAS_COLOR]->(pinkColor)
CREATE (coffeeMate)-[:HAS_FLAVOR]->(hazelnut)
CREATE (coffeeMate)-[:HAS_FLAVOR]->(frenchVanilla)
CREATE (coffeeMate)-[:HAS_FLAVOR]->(irishCreme)
CREATE (coffeeMate)-[:HAS_FLAVOR]->(italianSweetCreme)

WITH hazelnut, artificial, frenchVanilla, irishCreme, italianSweetCreme, artificialAndNatural
CREATE (hazelnut)-[:HAS_FLAVOR_TYPE]->(artificial)
CREATE (frenchVanilla)-[:HAS_FLAVOR_TYPE]->(artificialAndNatural)
CREATE (irishCreme)-[:HAS_FLAVOR_TYPE]->(artificialAndNatural)
CREATE (italianSweetCreme)-[:HAS_FLAVOR_TYPE]->(artificialAndNatural)


1 Like

Here is my crack at this fun challenge!

Raw Graph Data

Filtered using cypher:

MATCH (pf:ProductFamily {name: "Coffee Creamer"})<-[:Parent]-(p:Product)-[:isSuppliedBy]->(s:Supplier {name: "Nestle"}),
(p)<-[:Instance_Of]-(pi:Product_Instance)-[:storedin]->(sl:StorageLocation)
RETURN pi, sl

1 Like

This was fun. there you go, my quick and dirty graph...

1 Like

Here's my Cypher query

// Delete all nodes
MATCH (n) DETACH DELETE n;

CREATE (hazelnut:hazelnut {name: "Hazelnut", version: "old"});
CREATE (hazelnut:hazelnut {name: "Hazelnut", version: "old"});
CREATE (hazelnut:hazelnut {name: "Hazelnut", version: "old"});
CREATE (hazelnut:hazelnut {name: "Hazelnut", version: "new"});

CREATE (irish_creme:irishCreme {name: "Irish Creme", version: "old"});
CREATE (irish_creme:irishCreme {name: "Irish Creme", version: "old"});
CREATE (irish_creme:irishCreme {name: "Irish Creme", version: "old"});

CREATE (french_vanilla:frenchVanilla {name: "French Vanilla", version: "old"});
CREATE (french_vanilla:frenchVanilla {name: "French Vanilla", version: "old"});
CREATE (french_vanilla:frenchVanilla {name: "French Vanilla", version: "old"});
CREATE (french_vanilla:frenchVanilla {name: "French Vanilla", version: "new"});

CREATE (italian_sweet_cream:italianSweetCream {name: "Italian Sweet Cream", version: "new"});
CREATE (italian_sweet_cream:italianSweetCream {name: "Italian Sweet Cream", version: "new"});
CREATE (italian_sweet_cream:italianSweetCream {name: "Italian Sweet Cream", version: "new"});

CREATE (:flavour {name: "Natural"});
CREATE (:flavour {name: "Artificial"});
CREATE (:producer {name: "Nestle"});

MATCH (old {version: "old"}), (new {version: "new"}) 
WHERE old.name = new.name
MERGE (old) -[:TRANSFORMED_TO]-> (new);

MATCH (x)
WHERE x.name IN ["Hazelnut", "Irish Creme", "French Vanilla", "Italian Sweet Cream"]
MATCH (f:flavour {name: "Artificial"}) 
MERGE (x)-[:FLAVOURED]->(f);

MATCH (y)
WHERE y.name IN ["Irish Creme", "French Vanilla", "Italian Sweet Cream"]
MATCH (f:flavour {name: "Natural"}) 
MERGE (y)-[:FLAVOURED]->(f);

MATCH (z)
WHERE z.name IN ["Hazelnut", "Irish Creme", "French Vanilla", "Italian Sweet Cream"]
MATCH (p:producer {name: "Nestle"}) 
MERGE (z) <-[:PRODUCE]-(p);

I added the property version when I noticed that some pods, even with the same name, have different packaging.
I split the four types of pods into different nodes, where I label them by the color similar to the original color of the pods.
Then match them to the flavors, Artificial and Natural, then the producer, Nestle.

1 Like

Here’s my crack at this challenge: instead of forcing structure onto this chaotic bowl of creamers, I decided to let Neo4j do what it does best—find its own patterns! :man_detective::magnifying_glass_tilted_left:

Because, let’s be real—humans love spotting patterns in the universe (stars, clouds, even burnt toast), so why not let Neo4j embrace its inner cosmic detective and uncover the hidden order in this caffeinated chaos? :hot_beverage::sparkles:

Let’s see what beautiful, unexpected connections emerge—whether it’s the French Vanilla Constellation, the Hazelnut Nebula, or the Italian Sweet Crème Black Hole of Deliciousness!

Nodes

Brand: Coffee-Mate (Pink)

Container: Bowl (Blue)

Flavors: French Vanilla, Hazelnut, Italian Sweet Crème, Irish Crème (Red)

Creamers: 14 total (Orange)

Relationships

Creamer → BELONGS_TO → Brand

Creamer → CONTAINED_IN → Container

Creamer → FLAVOR → Flavor

1 Like

@nirmit.sawant - so great! Thanks for entering and making your post!

This is great! Our judge will have some thinking to do with all of the great entries.

Absolutely blown away by the response! :fire: So many amazing entries from first-time posters :sparkles: and some legendary Graphites we haven’t seen in years making a comeback! :raising_hands: Let’s keep this energy going—if you haven’t jumped in yet, now’s the time! :pen::chart_increasing: #GraphOn.

I am still working on the all important T-Shirt selection - but I am proud to announce that our very own, notorious @abk will be our judge for our first 2025 Graph Challenge!