2017-10-30 9 views
0

私のdbにはタグでタグ付けされたリソースがあります。タグは他のタグ内にあっても構いません(つまり、neo4jは(neo4j:tag)-[:WITHIN]->(databases:tag)のように 'データベース'に接続されます)。ただし、すべてのタグに親があるわけではありません。ノードをノードのセットに直接的かつ間接的に接続するにはどうすればよいですか?

「データベース」を検索すると、「neo4j」という井戸でタグ付けされたリソースが返されます。

オプションの試合を試しましたが、期待どおりに動作しません。

MATCH (re:resource)-[:TAGGED_WITH]->(child:tag) 
OPTIONAL MATCH (parent:tag)<-[:WITHIN_TAG]-(:tag)<-[:TAGGED_WITH]-(re) 
WHERE child.uid IN {includedTags} OR parent.uid IN {includedTags} 
RETURN re 

含まれるタグはタグIDの配列です。

さらに次のようなことを試しましたが、親を持つタグだけでタグ付けされたリソースを返すようです。

OPTIONAL MATCH (parent:tag)<-[:WITHIN_TAG]-(:tag)<-[:TAGGED_WITH]-(re:resource)-[:TAGGED_WITH]->(child:tag)

任意の提案やアイデアをいただければ幸いです。

答えて

1

このクエリは、動作するはず:

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

可変長0以上WITHIN_TAG関係とパスと一致、開始およびtagノードで終わるパターン(:tag)<-[:WITHIN_TAG*0..]-(u:tag)。長さ0のパスの場合、開始ノードと終了ノードは実際には同じノードになります。

注意:実際には、可変長パス(例:[:WITHIN_TAG*0..5])に適切な上限を使用する必要があります。そうしないと、クエリが完了したりメモリが不足することはありません。

+0

これは素晴らしいです!どうもありがとう。それは、WITHIN_TAGの関係が別の方法を指している必要があるようです。 – bornytm

+0

このようにすることの望ましくない影響の1つは、より多くの検索タグを追加することは、結果を減らすのではなく、結果の数を広げることです。任意のタグではなく、すべての(またはほとんどの)タグに一致するノードを返す方法について考えてみませんか? – bornytm

関連する問題