0

友達の最大数と友達の最小数を持つユーザーを見つけたいです。ここに私のクエリがあります:

"start n=node:users({query}) match p=n-[?:Friend*]->x 
with distinct n,count(distinct x) as  cnt  "
+ "start n=node:users({query}) match p=n-[?:Friend*]->x 
with distinct n,count(distinct x) as cnt1, min(cnt) as minnumber "
+ "start n=node:users({query}) match p=n-[?:Friend*]->x
with distinct n,count(distinct x) as friendsNumber, max(cnt1) as 
maxnumber, minnumber  "
+ "where  friendsNumber=minnumber or friendsNumber=maxnumber  return n.name,
friendsNumber"

n はユーザーで、x は彼の友達です。しかし、私は3つのネストされたクエリを使用しましたが、そのパフォーマンスは良くないと思います.これを行う別の方法はありますか? ありがとう。

4

2 に答える 2

0

ここでは可変長パスを使用したくありません。また、友達がいる人に興味があるため、オプションの関係もありません。

ここでは、2 つのクエリを実行するのが最も賢明だと思います。

start n=node:users({query}) 
match p=n-[:Friend]->x
with ID(n),count(distinct x) as  cnt
with max(cnt) as max,min(cnt) as min

start n=node:users({query}) 
match p=n-[:Friend]->x
with n,count(distinct x) as  cnt
where cnt=max or cnt=min
return n.name

このようなものも動作するはずです: http://console.neo4j.org/r/xf3hm0

start n=node(*) 
match p=n-[:KNOWS]-x 
with n,count(distinct x) as  cnt 
with collect([n,cnt]) as data, max(cnt) as max,min(cnt) as min 
return extract(pair in 
   filter(pair in data 
     where tail(pair)=max OR tail(pair)=min) : 
   head(pair)) as person
于 2012-12-16T21:33:47.393 に答える
0

おそらく2回クエリする方が良いでしょう

START n=node:users({query})
MATCH n-[:Friend]->x
WITH n,count(x) as cnt
RETURN n, cnt order by cnt desc limit 1;

START n=node:users({query})
MATCH n-[:Friend]->x
WITH n,count(x) as cnt
RETURN n, cnt order by cnt asc limit 1;
于 2012-12-14T13:21:56.897 に答える