X 染色体祖先的 Neo4j 密码查询

标签 neo4j cypher genetics genealogy

在遗传系谱学中,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/

相关文章:

java - 在我的 JavaBeans 上实现 Apache TinkerPop

neo4j - Apoc Dijkstra 在计算最短路径时双向遍历

r - 当 Z 分数很大(p 值远低于零)时,如何从 R 中的 z 分数计算 p 值?

performance - 如何提高neo4j基础数据库的性能

neo4j - neo4j-service.service 单元加载失败

neo4j - 如何使用 Cypher 在 Neo4j 中复制子图

python - 创建字典的子集,按值列表对原始字典进行排序。

csv - Neo4j导入引用错误

neo4j - 如何在查询中修剪分支?

python - DNA 序列点图