Skip to content

Instantly share code, notes, and snippets.

@CalvinHarrisUK
Forked from ah3rz/WineGraph
Last active August 29, 2015 13:58
Show Gist options
  • Save CalvinHarrisUK/10114385 to your computer and use it in GitHub Desktop.
Save CalvinHarrisUK/10114385 to your computer and use it in GitHub Desktop.
= Dating =
Neo4j powers love. The online dating industry puts people’s interactions and connections at the very heart of its business. And these two concepts are closely linked. For example, if people have a connection to each other, through a shared friend or a shared interest, they are much more likely to get on. However, identifying these links is difficult – we all have a huge variety of interests and preferences that make us unique; making sense of all this data is a very complex task. This gist attempts to show how Neo4j has been used by clients to handle a such a significant task.
:neo4j-version: 2.0.0
:author: Amanda
:twitter: @pandamonial
:tags: domain:Dating
//hide
//setup
[source,cypher]
----
//CREATE OUR USERS
CREATE
(Jon:User {name:'Jonathan', from:'UK', seeking:'F',appearance:'Hot, Hot, Hot!',personality:'Fun loving, easy going', gender:'M' }),
(Jeremy:User {name:'Jeremy', from:'CA', seeking:'F',appearance:'Very handsome',personality:'Super friendly nerd', gender:'M'}),
(Kerstin:User {name:'Kerstin', from:'UK', seeking:'M', appearance:'Blonde hair, green eyes, athletic!',personality:'Fun loving, easy going', gender:'F' }),
(Peter:User {name:'Peter', from:'UK', seeking:'F', appearance:'Blue eyes, blue hair, nuff said!',personality:'Fun loving, easy going', gender:'M' }),
(Andreas:User {name:'Andreas', from:'UK', seeking:'F', appearance:'Tall, dark, handsome!', personality:'Fun loving, easy going', gender:'M' }),
(Michael:User {name:'Michael', from:'UK', seeking:'F', appearance:'spiked mohawk, athletic build, tattoos',personality:'Fun loving, easy going', gender:'M' }),
(Johan:User {name:'Johan', from:'UK', seeking:'F', appearance:'Fierce',personality:'Fun loving, easy going' , gender:'M'}),
(Medelene:User {name:'Medelene', from:'UK', seeking:'M', appearance:'Redhead',personality:'Fun loving, easy going', gender:'F' }),
(Allison:User {name:'Allison', from:'UK', seeking:'M', appearance:'Blonde goddess',personality:'Fun loving, easy going', gender:'F' }),
(Anna:User {name:'Anna', from:'UK', seeking:'M', appearance:'Brunette',personality:'Fun loving, easy going', gender:'F' }),
(Adam:User {name:'Adam', from:'UK', seeking:'F',appearance:'They call me an 11 out of 10!',personality:'Fun loving, easy going' , gender:'F'}),
(Jennifer:User {name:'Jennifer', from:'UK', seeking:'M',appearance:'Athletic build, redhead, tall',personality:'Relaxed, very forgiving', gender:'F' }),
(Frank:User {name:'Frank', from:'UK', seeking:'F',appearance:'Very attractive',personality:'spunky' , gender:'M'}),
(Amanda:User {name:'Amanda', from:'UK', seeking:'M',appearance:'Average Jane',personality:'geeky' , gender:'F'}),
(Jake:User {name:'Jake', from:'UK', seeking:'F',appearance:'Typical geek',personality:'funny', gender:'M' }),
(Anne:User {name:'Anne', from:'UK', seeking:'M',appearance:'Hot, Hot, Hot!',personality:'relaxed' , gender:'F'}),
(Julia:User {name:'Julia', from:'UK', seeking:'M',appearance:'Hot, Hot, Hot!',personality:'uptight' , gender:'F'}),
(Jane:User {name:'Jane', from:'UK', seeking:'M',appearance:'Hot, Hot, Hot!',personality:'Type A' , gender:'F'}),
(Maria:User {name:'Maria', from:'UK', seeking:'M',appearance:'Average',personality:'Girly girl' , gender:'F'}),
(Greta:User {name:'Greta', from:'UK', seeking:'M',appearance:'Hot',personality:'hipster', gender:'F' }),
(Katie:User {name:'Katie', from:'UK', seeking:'M',appearance:'Geek chic',personality:'chill' , gender:'F'}),
(Susan:User {name:'Susan', from:'UK', seeking:'M',appearance:'Tall, thin',personality:'artsy' , gender:'F'}),
(Melanie:User {name:'Melanie', from:'UK', seeking:'M',appearance:'A lot to love',personality:'Fun loving, easy going' , gender:'F'}),
(Heather:User {name:'Heather', from:'UK', seeking:'M',appearance:'Gorgeous',personality:'Fun loving' , gender:'F'}),
(Larry:User {name:'Larry', from:'UK', seeking:'F',appearance:'Blonde, Friends say he is a real 7',personality:'Fun loving, easy going',gender:'M' }),
(Michelle:User {name:'Julia', from:'UK', seeking:'M',appearance:'Hippie chick',personality:'Easy going' , gender:'F'}),
(Sally:User {name:'Jane', from:'UK', seeking:'M',appearance:'Hot, Hot, Hot!',personality:'relaxed' , gender:'F'}),
(Krista:User {name:'Maria', from:'UK', seeking:'M',appearance:'Blonde bombshell',personality:'Professional' , gender:'F'}),
(Lauren:User {name:'Greta', from:'UK', seeking:'M',appearance:'Tall, thin',personality:'shy', gender:'F' }),
(Zelda:User {name:'Katie', from:'UK', seeking:'M',appearance:'short, athletic',personality:'outgoing' , gender:'F'}),
(Caitlyn:User {name:'Susan', from:'UK', seeking:'M',appearance:'stout',personality:'funny' , gender:'F'}),
(Kelly:User {name:'Melanie', from:'UK', seeking:'M',appearance:'blonde, petite',personality:'spunky' , gender:'F'}),
(Sarah:User {name:'Heather', from:'UK', seeking:'M',appearance:'Average',personality:'Fun loving, easy going' , gender:'F'})
//CREATE Friend releationships
CREATE
(Jeremy)-[:KNOWS{connection:'Sister'}]->(Kerstin),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Peter),
(Jeremy)-[:KNOWS{connection:'Coworker'}]->(Andreas),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Michael),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Johan),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Madelene),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Allison),
(Michael)-[:KNOWS{connection:'Friend'}]->(Peter),
(Andreas)-[:KNOWS{connection:'Friend'}]->(Allison),
(Peter)-[:KNOWS{connection:'Friend'}]->(Johan),
(Kerstin)-[:KNOWS{connection:'Friend'}]->(Madelene),
(Andreas)-[:KNOWS{connection:'Friend'}]->(Anna),
(Allison)-[:KNOWS{connection:'Friend'}]->(Adam),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Jennifer),
(Jake)-[:KNOWS{connection:'Boss'}]->(Jennifer),
(jake)-[:KNOWS{connection:'Friend'}]->(Peter),
(Andreas)-[:KNOWS{connection:'Friend'}]->(Peter),
(Jon)-[:KNOWS{connection:'Friend'}]->(Jeremy),
(Jon)-[:KNOWS{connection:'Friend'}]->(Michael),
(Jon)-[:KNOWS{connection:'Friend'}]->(Jake),
(Jake)-[:KNOWS{connection:'Friend'}]->(Amanda),
(Jake)-[:KNOWS{connection:'Friend'}]->(Heather),
(Jake)-[:KNOWS{connection:'Friend'}]->(Melanie),
(Jake)-[:KNOWS{connection:'Friend'}]->(Katie),
(Michael)-[:KNOWS{connection:'Friend'}]->(Greta),
(Michael)-[:KNOWS{connection:'Friend'}]->(Maria),
(Michael)-[:KNOWS{connection:'Friend'}]->(Anne),
(Michael)-[:KNOWS{connection:'Friend'}]->(Jane),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Jennifer),
(Michael)-[:KNOWS{connection:'Friend'}]->(Allison),
(Michael)-[:KNOWS{connection:'Friend'}]->(Anna),
(Jeremy)-[:KNOWS{connection:'Friend'}]->(Susan),
(Jon)-[:KNOWS{connection:'Friend'}]->(Larry)
//CREATE Social Networks
CREATE
(JonTwitter:SocialNetwork {Application:'Twitter',ID:'@JonathanDreamym'}),
(JonFacebook:SocialNetwork {Application:'Facebook',ID:'Jonathan.Dreamyman'}),
(JonLinkedIn:SocialNetwork {Application:'LinkedIn',ID:'Jonathan.Dreamyman'}),
(JenniferLinkedIn:SocialNetwork {Application:'LinkedIn',ID:'Jennifer Smart'}),
(JenniferFacebook:SocialNetwork {Application:'Facebook',ID:'JennyLovesPandas'})
//Link Jon to his Social Networks
CREATE
(Jon)-[:HAS_SN{posts:20}]->(JonTwitter),
(Jon)-[:HAS_SN{posts:1000}]->(JonFacebook),
(Jon)-[:HAS_SN{posts:7}]->(JonLinkedIn),
(Jennifer)-[:HAS_SN{posts:500}]->(JenniferFacebook),
(Jennifer)-[:HAS_SN{posts:7}]->(JenniferLinkedIn)
//Create Sports Interest Graph
CREATE
(Sport:Interest{name:'Sports'}),
(AmericanFootball:Interest{name:'AmericanFootball'}),
(Basketball:Interest{name:'Basketball'}),
(Football:Interest{name:'Football'}),
(Baseball:Interest{name:'Baseball'}),
(Cubs:Interest{name:'Cubs'}),
(Patriots:Interest{name:'Patriots'}),
(Steelers:Interest{name:'Steelers'}),
(Lakers:Interest{name:'Lakers'}),
(Pacers:Interest{name:'Pacers'}),
(AmericanFootball)-[:IS_A]->(Sport),
(Baseball)-[:IS_A]->(Sport),
(Basketball)-[:IS_A]->(Sport),
(Football)-[:IS_A]->(Sport),
(AmericanFootball)-[:HAS_TEAM]->(Steelers),
(AmericanFootball)-[:HAS_TEAM]->(Patriots),
(Basketball)-[:HAS_TEAM]->(Pacers),
(Basketball)-[:HAS_TEAM]->(Lakers),
(Baseball)-[:HAS_TEAM]->(Cubs),
(Jennifer)-[:HAS_INTEREST]->(Steelers),
(Jon)-[:HAS_INTEREST]->(Patriots),
(Katie)-[:HAS_INTEREST]->(Patriots),
(Greta)-[:HAS_INTEREST]->(AmericanFootball)
//CREATE Other Interests
CREATE
(Cooking:Interest{name:'Cooking'}),
(Foodie:Interest{name:'Foodie'}),
(Drug:Interest{name:'Drugs'}),
(Meth:Interest{name:'Meth'}),
(Cocaine:Interest{name:'Cocaine'}),
(Cocaine)-[:IS_A]->(Drug),
(Meth)-[:IS_A]->(Drug),
(Jennifer)-[:HAS_INTEREST]->(Drug),
(Jane)-[:HAS_INTEREST]->(Meth),
(Maria)-[:HAS_INTEREST]->(Cocaine),
(Anne)-[:HAS_INTEREST]->(Foodie),
(Julie)-[:HAS_INTEREST]->(Foodie),
(Jon)-[:HAS_INTEREST]->(Cooking),
(Jennifer)-[:HAS_INTEREST]->(Foodie)
----
== Who are Jon's friends?
[source, cypher]
----
MATCH (Jon:User{name:'Jonathan'})-[:KNOWS]->(friend)
RETURN friend.name as name
----
//table
== Who are Jon's friends of friends?
[source, cypher]
----
MATCH (Jon:User{name:'Jonathan'})-[:KNOWS]->(friend)-[:KNOWS]->(FoF)
RETURN FoF.name as name
----
//table
== Who does Jon share the most friends with?
[source, cypher]
----
MATCH (Jeremy:User{name:"Jonathan"})-[:KNOWS]->(friend)
-[:KNOWS]->(fof)
RETURN distinct fof.name as name,length(collect(friend)) as FriendsInCommon
ORDER BY FriendsInCommon desc
----
//table
== Potential dates who like American Football
[source, cypher]
----
MATCH (date:User)-[:KNOWS*2]-(Jon:User{name : 'Jonathan'}),
(date)-[*..2]-(a:Interest{name:'AmericanFootball'})
WHERE date.gender = 'F'
RETURN distinct date.name as name
----
//table
== A suggested match
[source, cypher]
----
//Jon's perfect lady
MATCH (date:User)-[:KNOWS*2]-(Jon:User{name : 'Jonathan'}),
(date)-[:HAS_INTEREST]->(food:Interest{name:'Foodie'}),
(date)-[*..2]-(a:Interest{name:'AmericanFootball'}),
(date)-[r:HAS_SN]->(SN)
WHERE date.gender = 'F' AND r.posts > 2
RETURN distinct date.name as date
----
//table
//graph
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment