如何直接和间接连接到一组节点返回节点?

时间:2017-10-30 20:04:42

标签: neo4j cypher

在我的数据库中,我有标记了标记的资源。标签可以在其他标签内(即'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 个答案:

答案 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>