your shortest-path doesn't imply that it's not the same person. Robert would also be counted as direct friend.
On Wed, Mar 16, 2016 at 12:25 AM, Michael Azerhad <[email protected] > wrote: > Hi Michael, > > I think your query would result wrong results. > > Michael - *KNOWS* - Julia - *KNOWS* - Robert - *KNOWS* - Michael (same > Michael as previous one) > > It would consider Robert as a friend's friend for Michael (Michael - Julia > - Robert). > However, it is his direct friend ... (Robert - Michael) > I think your solution can't work with cyclic graph ;) > > That's why I used shortestPath function, that clearly avoids that. > > What do you think? > > > On Wednesday, March 16, 2016 at 12:03:52 AM UTC+1, Michael Hunger wrote: >> >> try this: >> >> MATCH (person:Person) >> OPTIONAL MATCH (person)-[:KNOWS]-(f1:Person)-[:KNOWS]-(f2:Person)-[:KNOWS >> ]-(f3:Person) >> WITH person, count(distinct f1) as f1, count(distinct f2) as >> f2,count(distinct >> f3) as f3 >> RETURN person._firstName + " " + person._lastName, f1, f2, f3 >> >> alternatively >> >> MATCH (person:Person) >> OPTIONAL MATCH (person)-[:KNOWS]-(f1:Person)-[:KNOWS]-(f2:Person) >> WITH person, count(distinct f1) as f1, count(distinct f2) as >> f2,collect(distinct f2) as p2 >> WITH person, f1,f2, reduce(x=0, p in p2 | x + size((p2)-[:KNOWS]-()) ) as >> f3 >> RETURN person._firstName + " " + person._lastName, f1, f2, f3 >> >> >> >> On Tue, Mar 15, 2016 at 10:30 PM, Michael Azerhad <[email protected]> >> wrote: >> >>> Using Neo4J 2.1.5. >>> >>> Data: >>> >>> - 2000 Persons >>> - KNOWS relationships between some of them >>> >>> >>> Goal of the query: >>> >>> For each person, display her fullname + amount of friends + amount of >>> friends' friends + amount of friends' friends' friends. >>> >>> >>> MATCH (person:Person) >>> WITH person >>> OPTIONAL MATCH person-[:KNOWS]-(p:Person) >>> WITH person, count(p) as f1 >>> OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..2]-(f2:Person)) >>> WHERE length(path) = 2 >>> WITH count(nodes(path)[-1]) AS f2, person, f1 >>> OPTIONAL MATCH path = shortestPath(person-[:KNOWS*..3]-(f3:Person)) >>> WHERE length(path) = 3 >>> WITH count(nodes(path)[-1]) AS f3, person, f2, f1 >>> RETURN person._firstName + " " + person._lastName, f1, f2, f3 >>> >>> >>> This query lasts long ! : 60 seconds ! >>> >>> Is there a tips to optimize it? >>> >>> Thanks, >>> >>> Michael >>> >>> -- >>> 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/d/optout. >>> >> >> -- > 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/d/optout. > -- 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/d/optout.
