我有一个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
,并在此递归结束时更深入结构。)
答案 0 :(得分:3)
这样的事情看起来是朝着正确的方向发展吗?
基本上使用apoc.path.expandConfig
从s
开始,然后开始抓取新的TagSynonym
和Tag
个节点。
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