2017-06-04 12 views
0

は、私は、ユーザーのノードPOSTED_BYあるアイテムのノードを、持って動作するようには思えません。さらに、アイテムは0個以上のユーザノードによってLIKEDされてもよく、0個以上のコメントがアイテムノードのPOSTED_INであってもよい。私がする必要がどのような複数のオプションMATCHは

特定のアイテムのノード(IDを与えられた)を照会、および取得することです。

  1. 項目ノード自体
  2. 項目がPOSTED_BY
  3. たユーザーノードコメントの数の項目ノード
  4. カウントのようなユーザーの数のカウントPOSTED_IN項目ノード

の場合私はちょうど1-3を照会しようとすると、今のところ4除外し、私のクエリは次のようになります。

MATCH (i:Item {id: 'ByvIzUdbZ'})-[:POSTED_BY]->(u:User) 
OPTIONAL MATCH (u2:User)-[:LIKES]->(i) 
RETURN i, u, COUNT(u2); 

これは、項目ノード、ユーザーを返し、好きが正しくカウントされます。今

、第4ポイントに対応するために、私は以下のように、別の任意MATCHを追加するために、クエリを変更:これにより

MATCH (i:Item {id: 'ByvIzUdbZ'})-[:POSTED_BY]->(u:User) 
OPTIONAL MATCH (u2:User)-[:LIKES]->(i) 
OPTIONAL MATCH (comment:Comment)-[:POSTED_IN]->(i) 
RETURN i, u, COUNT(u2), COUNT(comment); 

を、しかし、カウントをユーザ(U2)とコメント(コメント)の両方のために間違っています。彼らは "積み上げられている"ように見えます。だから、Likesが実際に3だった場合、好き嫌いとコメント数はどちらも6として返されます。私がここで間違っていることに関するヒントは?ありがとう。

答えて

1

あなたはcartesian productsの効果を見ています。

独自のにMATCHによって生成される行数がNになるが、既に(前回MATCH句から、例えば)が存在する行の数はMである、あなたはで終わる場合M×N行。

この乗法効果(パフォーマンスとメモリにも悪影響を与えます)を回避するには、該当する節の直後にaggregationを実行します。たとえば、あなたの場合:

MATCH (i:Item {id: 'ByvIzUdbZ'})-[:POSTED_BY]->(u:User) 
OPTIONAL MATCH (u2:User)-[:LIKES]->(i) 
WITH i, u, COUNT(u2) AS u2_count 
OPTIONAL MATCH (comment:Comment)-[:POSTED_IN]->(i) 
RETURN i, u, u2_count, COUNT(comment) AS comment_count; 
0

Cyber​​samは、あなたが見ているものを見ている理由についての良い説明があります。カーディナリティ(行数)は、クエリ内の操作(MATCHやOPTIONAL MATCHなど)が実行された回数にも影響します。 10人のユーザーが同じアイテムを掲載場合

はたとえば、あなたの最初の試合で、あなたは10人のユーザのそれぞれとの組み合わせで、1つの項目の10行を持っています。

次に、OPTIONAL MATCHが実行されます.1つのアイテムにつき1回だけ実行することを意味しますが(アイテムごとに同じ数を取得しようとしています)、10個の行があるため同じアイテムに対して10回実行されますその項目と一緒に。これは、ユーザーの集計、またはユーザーとの一致前に各アイテムに必要なデータを取得することで、その一致を実行する前に項目の数を1行に取得しようとすることで回避できます。ここで

はOPTIONAL一致するごとに1にカーディナリティを保ち、最後までユーザーのマッチングを保存し、少し良く働くかもしれない照会例です。

MATCH (i:Item {id: 'ByvIzUdbZ'})  // one row 
OPTIONAL MATCH (u2:User)-[:LIKES]->(i) 
WITH i, COUNT(u2) AS u2_count   // back to 1 row 
OPTIONAL MATCH (comment:Comment)-[:POSTED_IN]->(i) 
WITH i, u2_count, COUNT(comment) AS comment_count; // back to one row again 
MATCH (i)-[:POSTED_BY]->(u:User) 
RETURN i, u, u2_count, comment_count 
関連する問題