2017-08-01 26 views
1

同じ関係を持つ複数のノードを取得するためにクエリを書くべきですか?例えば、同じ関係を持つ複数のノードへのNeo4jクエリ

(u:user)-[r:USER_HAS_SKILL]->(s:skill) 

は私が持っているユーザーを取得したいグラフパターンと、のスキル「A」およびスキル「B」としましょう。 もちろん、私はこのようにすることはできませんか?ここで

MATCH (u:user)-[r:USER_HAS_SKILL]->(s:skill) 
WHERE s.name = "A" AND s.name = "B" 
RETURN u.username 

グラフ

iは照会に使用しています:

Example of graph

+0

質問に表示されるクエリの問題は何ですか?希望の出力は何ですか? –

+0

スキルの名前プロパティがリストではないため、上記のクエリは機能しません。だから、クエリ s.name =「A」AND s.name =「B」を使用してコースの は、データベース内のすべての試合を与えることはありません。 両方のスキルを持っているユーザーを取得したいと思います。 –

+0

はい、そうです。私はあなたの質問に答えました。 –

答えて

1

あなたはこのようなクエリを試すことができます:

MATCH (skillA {name : "A"}) 
MATCH (skillB {name : "B"}) 
MATCH (u:user) 
WHERE (u)-[:USER_HAS_SKILL]->(skillA) 
AND (u)-[:USER_HAS_SKILL]->(skillB) 
RETURN u.username 

問合せは、上記skillAskillB一致します。後、WHERE句はskillAskillBとの関係:USER_HAS_SKILLを持っているユーザーのみが一致することを保証します。

EDIT:

私が見る、仕事ができる:

コメントから!どうもありがとうございました!!しかし、より多くの がありますか?たとえば、 というスキルを持つユーザーを見つけようとすると、クエリはどのようになりますか?

MATCH (s:skill) WHERE s.name IN ["A", "B"] 
MATCH (u:user)-[:USER_HAS_SKILL]->(s) 
RETURN u.username 

このクエリでは、よりエレガントなアプローチで同じ作業を行う必要があります。この方法で、すべてのスキル名を配列に入れることができます。

+0

私は、それが動作することがわかります!どうもありがとうございました!! しかし、より効率的な方法はありますか? 10のスキルを持つユーザーを見つけたいと思ったら、クエリはどのようになりますか? –

+0

@WilliamStefanHartono私は自分の答えを編集しました。それを試してみてください! :)彼は@NicoleWhite新しい編集が行われたB. –

+0

は動作しません。 :) それを試してみてください! –

2

それは多くのスキルであり、あなたが明示的にそれを書きたくない場合は、このような何かを行うことができます。

WITH ['A', 'B', 'C', 'D', 'E'] AS skillset 
MATCH (u:User)-[:USER_HAS_SKILL]->(s:Skill) 
WHERE s.name IN skillset 
WITH skillset, u, count(s) AS matches 
WHERE matches = size(skillset) 
RETURN u.username; 
関連する問題