2016-10-21 8 views
2

ラベルの1つに2つのラベルと条件ベースのデータの間に関係がないかどうかのデータを取得する必要があります。私は比較演算子とNeo4jの問合せの関係

MATCH (n:Label1) 
WHERE NOT (n)-[:REL_1]-(:Label2) 
OR (n)-[:REL_1]-(e:Label2 {id:1}) 
RETURN count(DISTINCT(n)) 

::次の答えを見つけました。しかし私は必要なの​​すべてのデータのようなものです私のような::

MATCH (n:Label1) 
WHERE NOT (n)-[:REL_1]-(:Label2) 
OR (n)-[:REL_1]-(e:Label2) 
WHERE e.id >= 5 
RETURN count(DISTINCT(n)) 

クエリを実行すると、結果に

を来るべきでは生産していますエラー::

Invalid input 'H': expected 'i/I' (line 1, column 94 (offset: 93)) 
+0

あなたの最後のWHEREに変数 'e'がありますが、それはあなたのクエリのどこにも存在しません。それは 'n'になったのでしょうか、' e'変数をクエリのどこかに追加するのを忘れましたか? – InverseFalcon

答えて

3

[UPDATED]

Cypherクエリに2つの行を含めることはできません。WHEREまた、eという識別子も定義していません。

このクエリは動作するはず

(私はあなただけでは、そのような関係を持っていない場合、またはそれがe.idは、少なくとも5である少なくとも一つを持っている場合nをカウントすると仮定):

MATCH (n:Label1) 
OPTIONAL MATCH (n)-[:REL_1]-(e:Label2) 
WITH n, e 
WHERE e IS NULL OR e.id >= 5 
RETURN count(DISTINCT n); 
+0

カウントが不一致です。空のリレーション数が1050で、リレーション数が507です。あなたの質問によると、e.id> = 5を取り除いた場合、正確なカウント(1050)が与えられていないので、合計カウントである1557のカウントが与えられます。何をすべきか? – chikku

+1

WHEREはOPTIONAL MATCHにのみ適用されます。これは実際に必要なものではありません。最初の一致の結果をフィルタリングすることはありません。 OPTIONAL MATCHとWHEREの間に 'WITH n、e'を追加してみてください。 – InverseFalcon

+0

ニースキャッチ。私の答えを更新しました。 – cybersam

0

することができますネストWHEREフィルタを使用するには、構文的な砂糖をあきらめるだけです。あなたが複数に(INと `WHERE間)任意のマッチフィルターあなたが内部的にもフィルタを適用することができるようにあなたがANYALLNONEツールセットとの夢を見ることができる構造、および巣反復可能なコンポーネントを再構築

MATCH (n:Label1) 
WHERE ALL(p IN (n) - [:REL_1] - (:Label2) WHERE LAST(NODES(p))['id'] >= 5) 
RETURN COUNT(n) 

深さ