Find Activity Streams in a network without scaling penalty
This is an approach for scaling the retrieval of activity streams in a friend graph put forward by Rene Pickard as Graphity. In short, a linked list is created for every persons friends in the order that the last activities of these friends have occured. When new activities occur for a friend, all the ordered friend lists that this friend is part of are reordered, transferring computing load to the time of new event updates instead of activity stream reads.
Tip This approach of course makes excessive use of relationship types. This needs to be taken into consideration when designing a production system with this approach. See Section 17.5, “Capacity” for the maximum number of relationship types. |
To find the activity stream for a person, just follow the linked list of the friend list, and retrieve the needed amount of activities form the respective activity list of the friends.
Query
MATCH p=(me { name: 'Jane' })-[:jane_knows*]->(friend),(friend)-[:has]->(status) RETURN me.name, friend.name, status.name, length(p) ORDER BY length(p)
The returns the activity stream for Jane.
Result
me.name | friend.name | status.name | length(p) |
---|---|---|---|
3 rows | |||
|
|
|
|
|
|
|
|
|
|
|
|
Try this query live create (_0 {`name`:"Joe"}) create (_1 {`name`:"Ted"}) create (_2 {`name`:"Bob_s1"}) create (_3 {`name`:"Bob"}) create (_4 {`name`:"Bill"}) create (_5 {`name`:"Bill_s1"}) create (_6 {`name`:"Bill_s2"}) create (_7 {`name`:"Joe_s2"}) create (_8 {`name`:"Jane"}) create (_9 {`name`:"Ted_s2"}) create (_10 {`name`:"Joe_s1"}) create (_11 {`name`:"Ted_s1"}) create (_0)-[:`jane_knows`]->(_3) create (_0)-[:`has`]->(_10) create (_1)-[:`bob_knows`]->(_4) create (_1)-[:`has`]->(_11) create (_3)-[:`has`]->(_2) create (_3)-[:`bob_knows`]->(_1) create (_4)-[:`jane_knows`]->(_0) create (_4)-[:`has`]->(_5) create (_5)-[:`next`]->(_6) create (_8)-[:`jane_knows`]->(_4) create (_10)-[:`next`]->(_7) create (_11)-[:`next`]->(_9) ; MATCH p=(me {name: 'Jane'})-[:jane_knows*]->(friend), (friend)-[:has]->(status) RETURN me.name, friend.name, status.name, length(p) ORDER BY length(p)