Neo4j Cypher递归查询

3
我有一个Cypher查询,返回两个节点之间的节点:
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等等。

这个结构的深度可能会很大。

请帮我扩展此查询,以便返回在t:Tag上建立的所有TagSynonym及其同义词继承者(tags for s:Tag和更深层次,直到递归结构的末端)。

1个回答

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

谢谢您的回答。我很抱歉,但是是否有可能在不使用apoc的情况下实现?我之前尝试安装apoc,但失败了(特别是对于基于嵌入式Neo4j的测试),并且在我的应用程序中使用纯Cypher查询。 - alexanoid
2
我添加了一个非APOC查询,可能适合您的情况。我不确定它在处理您的数据时会表现如何。此外,请注意路径扩展中的裸体*;根据您的TagTagSynonym节点之间的关系复杂程度,它可能很快失控。 - Dave Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接