在遗传系谱学中,X 染色体数据可用于关联某些祖先。这在以下位置得到了很好的说明:X-DNA Inheritance Chart
我的 Neo4j 数据库有每个人的节点以及连接他们的父亲和母亲的关系。每个节点都有一个属性 sex(对于 Person 的性别;M 或 F)。女性有两条 X 染色体,一条来自 parent 双方。男性有一条 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(两个 M 依次在一起),这些对起始人的 X 染色体没有贡献。
我想删除任何具有 MM 模式的节点。使用外部代码很容易做到这一点,但我不知道如何在密码查询中做到这一点。
最佳答案
这应该适合你:
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这证明了结果。
关于X 染色体祖先的 Neo4j 密码查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952175/