Neo4j找不到最低共同的祖先节点

时间:2017-09-28 18:29:43

标签: neo4j cypher shortest-path genetic lowest-common-ancestor

我已经加载了DNA SNP的分层树(DAG)。我想确定最低共同的祖先。

此查询有效,产生单个正确的节点:

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返回的结果是否在最短的路径中?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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