2017-09-28 128 views
0

我已經加載了DNA SNP的分層樹(DAG)。我想確定最低的共同祖先。Neo4j最低共同祖先節點未找到

此查詢的工作,產生一個正確的節點:

Match (n:SNPNode{SNP:'R-Z11'}), (m:SNPNode{SNP:'R-BY13828'}) 
match path=(n)-[:SNPParent*..99]->(MRCA)<-[:SNPParent*..99]-(m) 
return MRCA.SNP 

然而,這一個產生任何結果:

Match (n:SNPNode{SNP:'R-Z11'}), (m:SNPNode{SNP:'R-S25289'}) 
match path=(n)-[:SNPParent*..99]->(MRCA)<-[:SNPParent*..99]-(m) 
return MRCA.SNP 

即使兩個查詢尋求兩者產量的祖先節點其中一些共享:

MATCH p=(n:SNPNode{SNP:'R-Z11'})-[r:SNPParent*..66]->(m) RETURN m.SNP 

m.SNP 
R-Z338 
R-Z8 
R-Z7 
R-Z2 
R-Z345 
R-Z27 
R-Z30 
R-Z9 
R-L48 
R-Z301 
R-Z381 
R-U106 
R-L151 
R-L51 
R-L23 
R-M269 
R-P297 
R-L389 
R-L754 
R-M343 

MATCH p=(n:SNPNode{SNP:'R-Z25289'})-[r:SNPParent*..66]->(m) RETURN m.SNP 

m.SNP 
R-S16701 
R-S1774 
R-Z341 
**R-Z11** 
R-Z338 
R-Z8 
R-Z7 
R-Z2 
R-Z345 
R-Z27 
R-Z30 
R-Z9 
R-L48 
R-Z301 
R-Z381 
R-U106 
R-L151 
R-L51 
R-L23 
R-M269 
R-P297 
R-L389 
R-L754 
R-M343 

看來問題在於R-Z11在第二個查詢的路徑中,它本身就是祖先。換句話說,LCA有時處於最短路徑的末端。有沒有辦法解決這個問題,以便R-Z11在最短路徑中返回結果?

+0

您可能要仔細檢查有問題的節點。在沒有得到結果的查詢中,使用的SNP是'R-Z11'和'R-S25289'。但之後用於尋求祖先的查詢是針對'R-Z11'和'R-Z25289'的。您將S更改爲Z. – InverseFalcon

回答

0

我想你會想要確保你的可變長度路徑有一個0的下界(當你省略下界,就像在你當前的查詢中,它默認爲1)。這將使得可以將開始和結束節點視爲與MRCA可能的匹配。

Match (n:SNPNode{SNP:'R-Z11'}), (m:SNPNode{SNP:'R-S25289'}) 
match path=(n)-[:SNPParent*0..99]->(MRCA)<-[:SNPParent*0..99]-(m) 
return MRCA.SNP 
+0

感謝您的建議。但是,添加零的下限不會產生任何結果。 –

0

這裏是工作的查詢:

match p=(n:SNPNode{SNP:'R-Z11'})<-[:SNPChild*0..99]-(MRCA:SNPNode)-[:SNPChild*0..99]->(m:SNPNode{SNP:'R-BY13828'}) 
return MRCA.SNP 

或者,用布爾標誌,以獲得最低的共同祖先(MRCA):

match p=(n:SNPNode{SNP:'R-Z11'})<-[:SNPChild*0..99]-(MRCA:SNPNode)-[:SNPChild*0..99]->(m:SNPNode{SNP:'R-BY13828'}) unwind(nodes(p)) as pn 
return case when pn.SNP=MRCA.SNP then True else False end as MRCA,pn.SNP 

與此輸出

MRCA SNP

FALSE R-Z11

FALSE R-Z338

TRUE R-Z8

FALSE R-BY13828

相關問題