2

在遗传谱系学中,X 染色体数据有助于与某些祖先联系起来。这在以下位置得到了很好的说明:X-DNA Inheritance Chart

我的 Neo4j 数据库具有每个人的节点以及连接它们的父亲和母亲的关系。每个节点都有一个属性 sex(代表 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 按顺序在一起)这些对起始人的 X 染色体没有贡献。

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

4

3 回答 3

3

这应该适合你:

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);

是一个演示结果的控制台

于 2016-01-22T20:14:03.350 回答
2

聚会有点晚了,思考过程与@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
于 2016-01-22T20:33:51.513 回答
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 传递给另一个男性(例如,儿子)。

于 2016-03-06T22:23:34.983 回答