2016-07-03 20 views
1

私はノードUSERsとノードCARsを持っているとしましょう。彼らは関係LIKEによって接続することができます。ノードのリストとの関係を持つノードを見つける

LIKEdCARsを返信したいのですが、それはUSERsです。

MATCH (c:CAR)<-[r:LIKES]-(u:User) 
WHERE u.username IN ['Sara', 'John'] RETURN e, u 

しかしサラ、ジョンのいずれかまたは両方に好かれているすべての車を返します。

は現在、私はこのクエリを持っています。私はそれだけで好きな車に制限したいと思います。

UPDATE:ここ は、私がこれまでに思い付いたのですが、このアプローチは、私は、入力として名の配列を使用することはできません、私はそれで動作することができますが、その解決策を見つけるのが大好きですparamとして配列をとることができます。

MATCH (user:USER) WHERE user.username IN ['Sara', 'John'] 
WITH COLLECT(id(user)) AS user_ids 
MATCH (user:USER)-[:LIKES]->(car:CAR) 
WHERE id(user) IN user_ids 
WITH car, user_ids, COLLECT(id(user)) as ids_of_users_that_like_car 
WHERE ALL(user_id IN user_ids WHERE user_id IN ids_of_users_that_like_car) 
RETURN car 

答えて

0

私はこのクエリは、あなたのニーズを満たすだろうと思います。

ALL((関係を)EXISTS yのx)は

3つのすべてのサラ、ジョン、とビルのグラフと仮定すると:私が見つけた最も簡単な方法は、このレバレッジにあります

WITH ['Sara', 'John', 'Bill'] AS usernames 
MATCH (c:CAR) 
WHERE ALL(username IN usernames WHERE EXISTS((:User{name:username})-[:LIKES]->(c))) 
RETURN c 

EDIT: 代わりに、あなたはこれを試すことができ、最初にマッチマスタング車、およびPintosのようなジョンとビルのように、このコードはマスタングの車は、リスト内のすべてのユーザーに好かだけ車を返しますリストのユーザーの場合、thosが好きな車にマッチするeユーザーを絞り込み、そのユーザーのすべてが好きな車に絞り込みます。

MATCH (u:User) WHERE u.name IN ['Sara', 'John', 'Bill'] 
WITH u, COLLECT(u) AS users 
MATCH (u)-[:LIKES]->(c:CAR) 
WHERE ALL(user IN users WHERE EXISTS((user)-[:LIKES]->(c))) 
RETURN c 

あなたは最高の作品かを確認するために設定され、あなたの実際のデータにプロファイリングしたいと思います。

0

少しトリッキー:

MATCH (c:CAR) 

WHERE (c)<-[:LIKES]-(:User {username: 'Sara'}) 

AND (e)<-[:LIKES]-(:User {username: 'John'}) 
return c 
関連する問題