【问题标题】:Neo4j cypher query for X-chromosome ancestorsNeo4j 密码查询 X 染色体祖先
【发布时间】:2016-04-29 09:01:40
【问题描述】:

在遗传谱系学中,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 依次在一起),它们对起始 Person 的 X 染色体没有贡献。

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

【问题讨论】:

    标签: neo4j cypher genetics genealogy


    【解决方案1】:

    这应该适合你:

    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 演示了结果。

    【讨论】:

    • 太棒了。它确实有效。需要更长的时间(约 750 毫秒),但无需在外部代码中进行后处理。所以这就是我需要的!
    【解决方案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
    

    【讨论】:

    • 它给出了一个错误:未知标识符n。我仔细研究了这个,不明白为什么。这看起来是一个很好的解决方案,但没有奏效。
    • 对不起,我必须转录一些项目,我的数据不完全相同。我对那里的内容进行了一些更新,如果您愿意,可以再试一次。
    • 还是报错:未知标识符n..我相信这可能是因为idx+1超出了性别的范围。
    【解决方案3】:

    这个查询只让我得到贡献 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 传递给另一个男性(例如儿子)。

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多