2017-02-21 17 views
0

パスに存在するノードをフェッチするCypherクエリを作成しているため、パスと予想される結果に期待されるノードの開始ノードとリストを提供しています提供されたリストからのノードです。我々は、SQL 2100の制限を持っているようNeo4j Cypher - クエリの "in"句の制限

あなたはのNeo4jにおける句での制限が何であるかを提案してくださいことができます。

例クエリ:

MATCH (n:person{key:2529962, ownBy:0}) 
MATCH path = n<-[:relation]-(c:Equipment) 
WHERE c.key in [1505697,2406945,2408297,2408531,2410815,2413566,2415224,] 
RETURN distinct EXTRACT (p in NODES(path)| p.key); 

おかげ Navneet

答えて

2

私は制限がコレクションのためにあるかわからないんだけど、私は簡単にreturn range (1,100000) as largeCollection 100,000を作成することができます。

しかし、これらのノードを取得するためのより良い方法は、行の中にコレクションをほどく、その後、それらのキーを持つノードに一致させることです。

// better to parameterize this, when you get the chance 
WITH [1505697,2406945,2408297,2408531,2410815,2413566,2415224] as equipKeys 
MATCH (n:person{key:2529962, ownBy:0}) 
UNWIND equipKeys as equipKey 
MATCH (c:Equipment{key:equipKey}) 
MATCH path = (n)<-[:relation]-(c) 
RETURN distinct EXTRACT (p in NODES(path)| p.key); 

EDIT

あなたのコメントから、それはあなたのようです人ノード:機器のノードあなたへのパスを持っている:のみ装備キーを返すようにしたいです。

現在使用しているマッチでは可能な限りすべてのパスが見つかるため、中規模から大規模のグラフ、特に多くのリレーションシップが発生します。

は、あなたはおそらく、そのようなパスが存在する場合はtrueまたはfalseを返しますEXISTS()関数を利用することをお勧めします。それはあなたが可能なの上限を与えることによって、パスを制限することを検討する必要があり、と述べました。

WITH [1505697,2406945,2408297,2408531,2410815,2413566,2415224] as equipKeys 
MATCH (n:person{key:2529962, ownBy:0}) 
UNWIND equipKeys as equipKey 
MATCH (c:Equipment{key:equipKey}) 
WITH DISTINCT n, c 
WHERE EXISTS((n)<-[:relation*0..10]-(c)) 
RETURN c.key 
+0

感謝を。 – Navneet

+0

私のユースケースでは、結果がn番目のレベルまでのパスに存在するキーとして欲しいので、上記のクエリは次のようになります: "WITH [1505697,2408531,2410815,2413566,2415224] as equipKeys MATCH(N:人{キー:2529962、ownBy:0}) UNWIND equipKeys equipKey MATCH(C:機器{キー:equipKey})など=(N)< MATCHパス - [* 0の関係.. ] - (c) RETURN distinct c.key " しかし、このクエリは、関係の数が多いノードの場合は時間がかかります。あなたは同じことを達成するために任意のより良い方法を提案してくださいすることができます。 ありがとう – Navneet

0

あなたは簡単にそれをテストすることができます:それは助け

UNWIND RANGE(0,6) as p 
WITH toInt(10^p) as maxx 
WITH maxx, RANGE(1,maxx) as testArray 
RETURN maxx, size(testArray), maxx IN testArray, (maxx+1) IN testArray