Skip to content

Instantly share code, notes, and snippets.

@s1ck
Last active December 26, 2015 05:18
Show Gist options
  • Save s1ck/7099251 to your computer and use it in GitHub Desktop.
Save s1ck/7099251 to your computer and use it in GitHub Desktop.
CREATE (alice:User{name:'Alice'})
CREATE (bob:User{name:'Bob'})
CREATE (eve:User{name:'Eve'})
CREATE (mallory:User {name:'Mallory'})
CREATE (peggy:User{name:'Peggy'})

CREATE (java:Product{name:'Java'})
CREATE (cpp:Product {name:'C++'})
CREATE (python:Product {name:'Python'})
CREATE (ruby:Product {name:'Ruby'})

CREATE alice-[:FRIEND_OF]->bob
CREATE alice-[:FRIEND_OF]->eve
CREATE alice-[:FRIEND_OF]->mallory
CREATE alice-[:FRIEND_OF]->peggy
CREATE bob<-[:REVIEWED_BY]-java
CREATE bob<-[:REVIEWED_BY]-cpp
CREATE eve<-[:REVIEWED_BY]-java
CREATE eve<-[:REVIEWED_BY]-cpp
CREATE eve<-[:REVIEWED_BY]-python
CREATE mallory<-[:REVIEWED_BY]-pyhon
CREATE peggy<-[:REVIEWED_BY]-ruby

overlapping products → works

START user=node(*)
MATCH user:User-[:FRIEND_OF]-friends1:User<-[:REVIEWED_BY]-products:Product,
products:Product-[:REVIEWED_BY]->friends2:User
WITH user, products, collect(distinct id(friends1)) as f1, collect(distinct id(friends2)) as f2
WITH user, products, filter(x in f1 WHERE x in f2) as intersect
WITH user, products, count(products) as n, intersect, length(intersect) as intersect_cnt
WHERE intersect_cnt > 1 and n > 0
RETURN id(user) as user_id, n, id(products) as product_id, intersect as friends, intersect_cnt
ORDER BY n DESC, intersect_cnt DESC, product_id
LIMIT 25;

overlapping products with bounding element by node attribute → works

MATCH user:User-[:FRIEND_OF]-friends1:User<-[:REVIEWED_BY]-products:Product,
products:Product-[:REVIEWED_BY]->friends2:User
WHERE user.name='Alice'
WITH user, products, collect(distinct id(friends1)) as f1, collect(distinct id(friends2)) as f2
WITH user, products, filter(x in f1 WHERE x in f2) as intersect
WITH user, products, count(products) as n, intersect, length(intersect) as intersect_cnt
WHERE intersect_cnt > 1 and n > 0
RETURN id(user) as user_id, n, id(products) as product_id, intersect as friends, intersect_cnt
ORDER BY n DESC, intersect_cnt DESC, product_id
LIMIT 25;

overlapping products with bounding element by node id → works not

please use the user_id of Alice

START user=node(1)
MATCH user:User-[:FRIEND_OF]-friends1:User<-[:REVIEWED_BY]-products:Product,
products:Product-[:REVIEWED_BY]->friends2:User
WITH user, products, collect(distinct id(friends1)) as f1, collect(distinct id(friends2)) as f2
WITH user, products, filter(x in f1 WHERE x in f2) as intersect
WITH user, products, count(products) as n, intersect, length(intersect) as intersect_cnt
WHERE intersect_cnt > 1 and n > 0
RETURN id(user) as user_id, n, id(products) as product_id, intersect as friends, intersect_cnt
ORDER BY n DESC, intersect_cnt DESC, product_id
LIMIT 25;

overlapping products with bounding element by node id but without labels → works

please use the user_id of Alice

START user=node(1)
MATCH user-[:FRIEND_OF]-friends1<-[:REVIEWED_BY]-products,
products-[:REVIEWED_BY]->friends2
WITH user, products, collect(distinct id(friends1)) as f1, collect(distinct id(friends2)) as f2
WITH user, products, filter(x in f1 WHERE x in f2) as intersect
WITH user, products, count(products) as n, intersect, length(intersect) as intersect_cnt
WHERE intersect_cnt > 1 and n > 0
RETURN id(user) as user_id, n, id(products) as product_id, intersect as friends, intersect_cnt
ORDER BY n DESC, intersect_cnt DESC, product_id
LIMIT 25;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment