Neo4j Cypher递归查询

时间:2017-07-02 16:46:49

标签: neo4j cypher

我有一个Cypher查询,它在两个TagSynonym个节点之间返回一个Tag节点:

MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 
WHERE t.id = {tagId} AND s.id = {synonymId} 
RETURN ts

此外,s:Tag节点本身可以​​拥有自己的TagSynonym节点,如:

(s)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(ss:Tag) 

ss可以拥有自己的TagSynonym,依此类推。

这种结构的深度可能非常大。

请帮助我扩展此查询,以便返回在TagSynonym及其所有同义词后继者(t:Tag的标记)上建立的所有s:Tag,并在此递归结束时更深入结构。)

1 个答案:

答案 0 :(得分:3)

这样的事情看起来是朝着正确的方向发展吗?

基本上使用apoc.path.expandConfigs开始,然后开始抓取新的TagSynonymTag个节点。

MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 
WHERE t.id = {tagId} AND s.id = {synonymId} 
WITH t, ts, s
CALL apoc.path.expandConfig(s
{
  uniqueness:"NODE_GLOBAL",
  labelFilter:"TagSynonym|Tag",
  relationshipFilter: '<FOR|HAS>'
}) YIELD path
RETURN t, ts, s, path

可选地,为了在不使用APOC库的情况下实现类似的功能,您可以考虑这个查询的内容......

MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 
WHERE t.id = {tagId} AND s.id = {synonymId} 
WITH t,ts,s
OPTIONAL MATCH p=(s)-[:FOR|HAS*]-(end:Tag)
WHERE NOT (end)<-[:FOR]-()
RETURN p