-
-
Save CalvinHarrisUK/10114385 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
= 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