2017-07-02 80 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