在我的数据库中,我有标记了标记的资源。标签可以在其他标签内(即'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)
任何建议或想法都将不胜感激。
答案 0 :(得分:1)
此查询应该有效:
MATCH (re:resource)-[:TAGGED_WITH]->(:tag)<-[:WITHIN_TAG*0..]-(u:tag)
WHERE u.uid IN {includedTags}
RETURN DISTINCT re;
可变长度模式(:tag)<-[:WITHIN_TAG*0..]-(u:tag)
将匹配具有0个或更多WITHIN_TAG
个关系的路径,并以tag
个节点开始和结束。对于0长度路径,起始节点和结束节点实际上将是同一节点。
警告:您实际上应该为可变长度路径使用合理的上限(例如,[:WITHIN_TAG*0..5]
),否则您的查询可能永远不会完成或耗尽内存。 < / p>