Neo4j cypher查询X染色体祖先

时间:2016-01-22 17:03:26

标签: neo4j cypher genetics genealogy

在遗传谱系中,X染色体数据可以与某些祖先联系起来。这可以在X-DNA Inheritance Chart

中得到很好的说明

我的Neo4j数据库为每个Person都有节点,并且连接父亲和母亲的关系。每个节点都有一个属性(对于Person的性别; M或F)。女性有两条X染色体,一条来自父母。男性有一条X染色体,总是来自母亲。

您可以使用reduce来查看祖先继承中涉及的性别:

match p=(n:Person{RN:1})-[:father|mother*..20]->m 
return m.fullname as FullName
,reduce(status ='', q IN nodes(p)| status + q.sex) AS c 
order by length(p), c

因此,从男性(RN:1)开始,c的结果是他父亲的MM和他母亲的MF,祖父的MMM和外祖父的MFM等。这种模式表明当c包含MM(序列中的两个Ms),这些MM对起始人的X染色体没有贡献。

我想删除任何具有MM模式的节点。使用外部代码很容易做到这一点,但我无法弄清楚如何在cypher查询中执行此操作。

3 个答案:

答案 0 :(得分:2)

这应该适合你:

MATCH p=(n:Person { RN:1 })-[:father|mother*..20]->m
WITH m, NODES(p) AS a
WITH m, REDUCE(c = "", i IN RANGE(0, SIZE(a)-1)| CASE
  WHEN c IS NULL OR (i > 0 AND (a[i-1]).sex = "M" AND (a[i]).sex = "M") THEN
    NULL
  ELSE
    c + (a[i]).sex
  END ) AS c
WHERE c IS NOT NULL
RETURN m.fullName AS fullName, c
ORDER BY LENGTH(c);

here is a console展示了结果。

答案 1 :(得分:1)

与@ cybersam的解决方案相比,派对和思考过程有点迟了。

match p=(n:Person { RN: 1 })-[:father|mother*..20]->(m) 
with p, m, extract( g in nodes(p) | g.sex ) as genders
with p, m, genders, range(0,size(genders) -1,1) as gender_index
unwind gender_index as idx
with p, m, genders, collect([genders[idx], genders[idx+1]]) as pairs
where not ['M','M']  in pairs
return m.fullName
,reduce(status ='', q IN nodes(p)| status + q.sex) AS c 
order by length(p), c

答案 2 :(得分:0)

这个查询让我只有祖先贡献一个X染色体:

match p=(n:Person{RN:1})-[:father|mother*..20]->(m)     
with m, reduce(status ='', q IN nodes(p)| status + q.sex) AS c     
where c=replace(c,'MM','') 
return m.RN,m.fullname as Name, c

性别集合为每一代增加了性别,并且过滤以排除任何MM,因为男性不能将他的X传送给另一个男性(例如,儿子)。