2017-07-02 74 views
2

我有一个返回两个Tag节点之间的TagSynonym节点的Cypher查询:Neo4j的暗号递归查询

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,更深到这个递归结构的结束。)

回答

3

请问是这样的看起来像是朝着正确的方向发展?

基本上使用apoc.path.expandConfig开始于s并开始抓取新的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 
+0

谢谢您的回答。我道歉,但没有apoc可以实现吗?我以前尝试安装apoc,但失败(特别是对于基于嵌入式Neo4j的测试),并在我的应用程序中使用纯Cypher查询。 – alexanoid

+2

我添加了一个非APOC查询,可能适合你。我不确定它会如何与您的数据行为。也要警惕路径扩展中裸露的'*';它可能会很快失去控制,这取决于你的Tag和TagSynonym节点的复杂关系。 –

+0

谢谢,它正在工作! – alexanoid