2016-09-01 9 views
1

特定のノードに接続していないすべてのノードを検索しようとしています。私は、割り当てを行っている生徒が物語の中でテーマを見つけ、解説を書くアプリを持っています。次に、他の学生は、これらの説明のピアレビューを行います。私のデータは次のようになります。アプリケーションの一部としてNeo4J Cypher特定のノードに接続するノードを除外します

Assignment-hasTheme->Theme-hasChild->Theme 
Annotation-theme->Theme 
Explication-owner->User 
Explication-annotation->Annotation 
PeerReview-explication->Explication 

、ユーザーはピアレビューを行う必要があるとき、私は他のユーザーによって書き込まれたすべてのexplicationsを見つける必要があります。このクエリは動作するはずのように私には思える:

MATCH 
    (u), 
    (a)-[:hasTheme]->(:Theme) 
    -[:hasChild*]->(:Theme) 
    <-[:theme]-(ann:Annotation) 
    <-[:annotation]-(e:Explication) 
OPTIONAL MATCH 
    (e)<-[:explication]-(p:PeerReview) 
WHERE id(a)=7 AND id(u)=4 
    AND (e)-[:owner]->(u) 
RETURN e, count(e) AS explicationCount 
ORDER BY explicationCount ASC 

問題はそれがないということです:私は、すべてのユーザーが書かれているすべてのexplicationsを取得します。それはユーザーが書いた説明を含んでいます。誰もそれらを除外する方法を教えてもらえますか?

答えて

2

WHERE句は、他の1つの句、つまり先にMATCHOPTIONAL MATCH、またはWITHとしか関連付けられていないという問題があります。クエリには、OPTIONAL MATCHに関連付けられています。

これを知っているクエリを再読み込みすると、最初のMATCHにはWHERE句がないことがわかります。したがって、すべての割り当てとすべてのユーザーが一致してすべての説明が見つかります。

次に、指定された割り当てと、指定されたIDを持つユーザーであるユーザーIDの間で、:PeerReviewsが一致するオプションの一致が行われます。 WHEREは、:PeerReviews(変数p)に一致するものにのみ影響します。

私が見ることができるカップルの他のもの...あなたがパターンにマッチした:Annotations上の変数annを導入する、とのための変数pしている:PeerReviewていますが、実際にはこれらに何もしていませんクエリ。これにより、OPTIONAL MATCHは役に立たなくなり、返品や返品をしていない:PeerReviewsになります。

これらの変数を削除し、OPTIONAL MATCHを完全に削除することをお勧めします。

MATCH 
    (u), 
    (a)-[:hasTheme]->(:Theme) 
    -[:hasChild*]->(:Theme) 
    <-[:theme]-(:Annotation) 
    <-[:annotation]-(e:Explication) 
WHERE id(a)=7 AND id(u)=4 
    AND (e)-[:owner]->(u) 
RETURN e, count(e) AS explicationCount 
ORDER BY explicationCount ASC 

あなたはOPTIONAL MATCHに追加し、マッチした:PeerReviewを使用し、それはMATCHに影響を与えるWHEREの下だということを確認し、そのようにしたい場合は、次のを受けて

MATCH 
    (u), 
    (a)-[:hasTheme]->(:Theme) 
    -[:hasChild*]->(:Theme) 
    <-[:theme]-(:Annotation) 
    <-[:annotation]-(e:Explication) 
WHERE id(a)=7 AND id(u)=4 
    AND (e)-[:owner]->(u) 
OPTIONAL MATCH 
    (e)<-[:explication]-(p:PeerReview) 
RETURN e, count(e) AS explicationCount, p 
ORDER BY explicationCount ASC 

EDIT

Explainとリンクされたすべての数:PeerReviews、このクエリを使用します。

それは、親テーマに注釈だけでなくだけではなく、その子を見つけますので、上記のクエリを更新しました
MATCH 
    (u), 
    (a)-[:hasTheme]->(:Theme) 
    -[:hasChild*0..]->(:Theme) 
    <-[:theme]-(:Annotation) 
    <-[:annotation]-(e:Explication) 
WHERE id(a)=7 AND id(u)=4 
    AND (e)-[:owner]->(u) 
OPTIONAL MATCH 
    (e)<-[:explication]-(p:PeerReview) 
RETURN e, count(p) as peerReviewCount 
ORDER BY peerReviewCount ASC 

EDIT

+0

ありがとうございました!私はそれをやっていないとは信じられません。私はCypherのドキュメントから誤解していたと思います - 私はWHEREがすべてのMATCH句に当てはまると思っていました。余分な変数は、私がクエリーでやりたかったいくつかの余計なものの結果でした。また、OPTIONAL MATCHでの私の目標は、各説明に含まれるレビューの数を数えることです(これは私がここで取り残したものです)。 –

+0

これはかなり一般的な誤解です。私はCypherを使い始めたときと同じ仮定をしました。あなたの独自のクエリを作成し始めるときにのみ実行するドキュメントからは分かりません。 – InverseFalcon

+0

もう1つのことは...あなたの返す 'e'と' count(e) 'は問題になる可能性があります。これは1行につき1つのExplicitなので、1行ごとに1になると思います。 – InverseFalcon

関連する問題