2016-06-01 17 views
1

サイファー - クエリのために、任意の交差点

MATCH (movie:Movie {name:'The Matrix'})-[:has_tag]->(movie1Tag:Tag) 
WITH movie, collect(movie1Tag) AS movie1Tags 
MATCH (movie2:Movie)-[:has_tag]->(movie2Tag:Tag) 
WITH movie, movie1Tags, collect(movie2Tag) AS movie2Tags, movie2 
WHERE ANY(movieTag IN movie1Tags 
        WHERE movieTag IN movie2Tags) 
     AND NOT movie.name = movie2.name 
RETURN DISTINCT movie2.name 

WHERE ANYの文から交差点を返す方法はありますか?それらを返すようにクエリを変更する方法はありますか?

編集: Anomaly211のおかげで答えが得られました。人々が興味を持っている場合には以下に含まれているEXTRACTを使用して関係に交点を適用しました。

MATCH (movie:Movie {name:'The Matrix'})-[:has_tag]->(movie1Tag:Tag) 
WITH movie, collect(movie1Tag) AS movie1Tags 
MATCH (movie2:Movie)-[:has_tag]->(movie2Tag:Tag) 
WITH movie, movie1Tags, collect(movie2Tag) AS movie2Tags, movie2 
WITH movie, movie1Tags, collect(movie2Tag) AS movie2Tags, movie2 FILTER(x IN movie1Tags WHERE x IN movie2Tags) AS intersect 
    FILTER(x IN movie1Tags WHERE x IN movie2Tags) AS intersect 
WHERE ANY(movieTag IN movie1Tags WHERE movieTag IN movie2Tags) AND NOT movie.name = movie2.name AS intersect 
CREATE UNIQUE (movie)-[:share_tags {shared:EXTRACT(x IN intersect | x.identifier)}]->(movie2) 
RETURN DISTINCT movie2.name, intersect 
+0

を与える必要がありますか?どのように例ですか? –

+0

ムービー1には、「アクション」、「90s」「ファンタジー」、「サイエンスフィクション」というタグがあります。映画2には、「サイエンスフィクション」、「90年代」、「コメディー」のタグがあります。だから、交差点にはタグ「サイエンスフィクション」と「90s」があります。それらは共にタグを共有します – Airomega

答えて

1

結果をフィルタリングして交差をチェックすることができます。

FILTER(x IN movie1Tags.name WHERE x IN movie2Tags.name) 

これは、あなたが交差点で何を意味するあなたのmovie1tagsとmovie2tagsの両方に存在しているタグだけ

+1

優れています。私はあなたがそれを働かせることができてうれしいです。 – Anomaly211

+1

@Airomega - 元の質問にあなたのソリューションを追加することができます。 –

+0

良いアイデア。完了:D – Airomega