1

会社、グループ、ウォッチリスト、メンバーのグラフを調べているクエリがあります。データベース内のデータについては、geoff形式のダミーデータの要点を参照してください。また、誰でもプレイできるようにコンソールneo4jをセットアップしました。

クエリの目的は、グループのリストと、グループおよび関連するウォッチリストと関係のあるメンバーの数(メンバーは個人または会社の総称です)を取得することです。

以下のクエリで正しいアラート番号を取得していますが、メンバーやウォッチリストがないため、「空のグループ」がありません。さまざまな関係をオプションにしようとしましたが、グループに関連するウォッチリストを使用しているため、アラートの数が間違ってしまいます。クエリを作成する方法を無数に試しましたが、問題を回避できません。

START company=node(233), group=node:node_auto_index("_type:group")
MATCH company-[:OWNS]->group-[?:LINKED_TO]->watchlist-[:WATCHING|APPOINTMENT*1..2]-member<-[:WATCHING]-group
RETURN group, COUNT(DISTINCT(member)) as alerts
ORDER BY group.name

理想的には、グループをメンバーに接続し、次にウォッチリストに接続するパスセグメント全体をオプションとして作成したいのですが、ドキュメントでその方法を見つけることができないか、それが不可能です。2つのクエリを実行する以外に、これを回避する方法はありますか?

正しい結果は、グループとアラートが次のようになることです。

Big Dot Coms, 1
Big Hitters, 4
Empty group, 0
Old CEOs, 1
4

2 に答える 2

2

私は正しく理解したと思いますが、これはあなたが探しているものだと思います:

START company=node:node_auto_index("name:\"Finance Ltd\""), group=node:node_auto_index("_type:group") 
MATCH company-[:OWNS]->group-[?:WATCHING]->member,group-[?:LINKED_TO]->watchlist 
WITH group, member, watchlist 
MATCH watchlist-[:WATCHING|APPOINTMENT*1..2]-member
RETURN group, count(distinct( member)) 
ORDER BY group.name

基本的に、WITHキーワードを使用してクエリを徐々に構築できます。まず、存在しないものを含むすべてのグループ<->メンバーのペアを取得します。次に、オプションでウォッチリストを照合し、最終一致を使用して条件を適用し、結果を返します。

于 2013-03-04T17:08:12.143 に答える
1

トラバーサルパターンのため、これはcypherでは不可能になると思います:-空のグループをカウントしたい場合、これはノードがないことを意味しますmember。この単純なバックトラックを想像してみてください。検索アルゴリズムにステップインするノードがなくなるとすぐに、1ステップ戻ります。ノードがないためmember、一致パターンがパターン全体に一致することはなく、 。company-[:OWNS]->group-[?:LINKED_TO]->watchlist-[:WATCHING|APPOINTMENT*1..2]-member<-[:WATCHING]-groupのみに一致しcompany-[:OWNS]->group-[?:LINKED_TO]->watchlistます。したがって、一致パターンが見つからない場合、結果にもデータがありません。

-カウントされたノードで一致パターンを終了することをお勧めします。つまり、のようなものcompany-[:OWNS]->group-[?:LINKED_TO]->watchlist-[:WATCHING|APPOINTMENT*1..2]-memberです。カウント結果でゼロが得られるよりも。コンソールで遊んでみましたが、データに空のグループが含まれていないようです。そのため、最終的なクエリを作成できません。

于 2013-03-04T08:20:42.477 に答える