2017-11-01 2 views
0

私のデータベースにはタグでタグ付けされたリソースがあります。タグは他のタグ内にあっても構いません(つまり、neo4jは(neo4j:tag)-[:WITHIN]->(databases:tag)のように 'データベース'に接続されます)。ただし、すべてのタグに親があるわけではありません。彼らは(子供を経由して)直接または間接的にならリソースは、このようなクエリでリソースに接続返されます。可変長の関係とcpyherを持つ内部結合と同等のものを見つけようとしています

MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag) 
WHERE u.uid IN {includedTags} 
RETURN DISTINCT re; 

これで、この問題がある場合、ユーザーの複数のタグを検索し(すなわち「のNeo4j」と「データベース')リソースは、検索タグと一致する場合に返されます。私が望むのは、返されたものすべてにマッチするリソースだけを持つことです。これにより、展開するのではなくタグを検索して検索を絞り込むことができます。

WITH DISTINCT re, count(*) AS connected 
WHERE connected = SIZE({includedSets}) 

私はかなりどのように把握することはできません。

は、(直接、すべての検索タグでタグ付けだけ返すリソース)を可変長パスを使用する前に、私は、接続されているタグの数を追跡することによって、これを達成しましたここでも似たようなことをする。

答えて

3

使用することはall predicate function

MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag) 
WITH re, collect(parent) AS parentTags 
WHERE all(tag IN {includedTags} WHERE tag IN parentTags) 
RETURN re; 

性能面では、これが最善の解決策ではないかもしれませんが、最初、それが動作するかどうかを見てみましょう。

あなたは、のUIDをチェックする親のこれらのプロパティを収集渡す場合:

MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag) 
WITH re, collect(parent.uid) AS parentTags 
WHERE all(tag IN {includedTags} WHERE tag IN parentTags) 
RETURN re; 

リソースは、多くのタグを持っている場合は、この最適化は役立つかもしれない:

WITH {includedTags} as includedTags 
UNWIND includedTags as tagId 
MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag {uid: tagId}) 
WITH re, includedTags, count(parent) AS parentTags 
WHERE size(includedTags) = parentTags 
RETURN re; 
+0

グレート!これは期待どおりに動作します。私はuidプロパティに基づいて一致しています(includedTagsは文字列uidの配列です)、これはノード全体で一致するよりも速いと思いますか?パフォーマンスを向上させるための考えがあるなら、それを聞いてみたいです。興味があるなら、クエリーはknowlo.ioに公開されています。 – bornytm

+1

私は最適化されたバージョンを追加しました - しかし、これは物事をスピードアップするかどうかはデータセットに大きく依存するので、それがうまくいくかどうか見るために単純なベンチマークを行うべきです。 –

関連する問題