So I found a fix for the second method, but there is yet another issue. You'd expect the nodes to be returned sorted by the amount of NEXT relationships they are removed from the timeLineEnding, and they are but the issue is that the nodes that are the most far away are returned first.
Op dinsdag 24 december 2013 11:12:09 UTC+1 schreef Pieter-Jan Van Aeken: > > Hi, > > > I'm somewhat in a pickle. Last night, I was trying to figure out an > intelligent and most of all performant system to do time-sorted > recommendations. > > *An example : Give me the last 100 messages posted by people I follow.* > > Note that I do not want the last 100 messages by each person, which would > be easier. No, I want the last 100 messages in total. And I don't quite > know how many of each person that I'll end up with. > > So I was thinking about building a time-index in the graph, like suggested > many times already but there are some issues with that. There are two > options I could think of: > > 1. You create a relationship between each time unit individually and then > you sort. You don't really build a tree, just 60 nodes for the minutes and > seconds, 24 nodes for the hours and you reuse them over and over. The only > ones you can't reuse are basicaly the year nodes. But there are some > concerns I have here: The time nodes potentially become very highly > connected nodes. I'm not sure if this is an issue though since they are > always at the end of the matching pattern. And then there's the sorting of > every single message which IMO sounds a bit ridiculous. > > *MATCH > (personA:USER)-[:FOLLOWS]->(personB:USER)-[:POSTS]->(message:MESSAGE),* > *(message)-[:POSTYEAR]->(year),* > > *(message)-[:POSTMONTH]->(month),* > > *(message)-[:POSTDAY]->(day),* > > *(message)-[:POSTHOUR]->(hour),* > > *(message)-[:POSTMINUTE]->(minute),* > > *(message)-[:POSTSECOND]->(second),* > *WHERE personA.email = "lala$at$lolo.com <http://lolo.com>"* > > *RETURN messageORDER BY year.value, month.value, day.value, hour.value, > minute.value, second.value* > *LIMIT 100* > > 2. You use the NEXT relationships between the time units. (here you do > build a tree!) > > *MATCH > (timelineEnding:TIME_END)<-[:ENDS]-(lastTimeLeafNode:TIMELEAF)<-[:NEXT*]-(previousTimeLeafNode:TIMELEAF)<-[:POSTTIME]-(message:MESSAGE)<-[:POSTS]-(personB:USER)<-[:FOLLOWS]-(personA:USER)* > *RETURN message LIMIT 100;* > > But again, I have some concerns here. First of all, the last message > posted is never returned like this, even if you do follow the poster of > that message. Secondly, if a billion messages are posted and only 5 by the > people you follow, you'd end up going over a billion messages. And thirdly, > to keep track of what the last posted message is, you have to remove the > ends relationship every time a message is created, and connect it to the > new "lastTimeLeafNode". > > Is there no better way than one of the above? > > > -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
