私のデータベースにはタグでタグ付けされたリソースがあります。タグは他のタグ内にあっても構いません(つまり、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})
私はかなりどのように把握することはできません。
は、(直接、すべての検索タグでタグ付けだけ返すリソース)を可変長パスを使用する前に、私は、接続されているタグの数を追跡することによって、これを達成しましたここでも似たようなことをする。
グレート!これは期待どおりに動作します。私はuidプロパティに基づいて一致しています(includedTagsは文字列uidの配列です)、これはノード全体で一致するよりも速いと思いますか?パフォーマンスを向上させるための考えがあるなら、それを聞いてみたいです。興味があるなら、クエリーはknowlo.ioに公開されています。 – bornytm
私は最適化されたバージョンを追加しました - しかし、これは物事をスピードアップするかどうかはデータセットに大きく依存するので、それがうまくいくかどうか見るために単純なベンチマークを行うべきです。 –