X-chromosome 个祖先的 Neo4j 密码查询
Neo4j cypher query for X-chromosome ancestors
在遗传系谱学中 X-chromosome 数据可用于链接某些祖先。这在以下位置得到了很好的说明:X-DNA Inheritance Chart
我的 Neo4j 数据库有每个人的节点以及连接他们的父亲和母亲的关系。每个节点都有一个 属性 性别(对于人的性别;M 或 F)。一位女性有两个 X-chromosome,其中一个来自 parent。男性有一个 X-chromosome,总是来自母亲。
您可以使用 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 依次在一起)时,这些不会对起始 Person 的 X-chromosome 做出贡献。
我想删除任何具有 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 证明了结果。
晚会有点晚了,思考过程与@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
这个查询只让我得到了贡献 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 传递给另一个男性(例如,儿子)。
在遗传系谱学中 X-chromosome 数据可用于链接某些祖先。这在以下位置得到了很好的说明:X-DNA Inheritance Chart
我的 Neo4j 数据库有每个人的节点以及连接他们的父亲和母亲的关系。每个节点都有一个 属性 性别(对于人的性别;M 或 F)。一位女性有两个 X-chromosome,其中一个来自 parent。男性有一个 X-chromosome,总是来自母亲。
您可以使用 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 依次在一起)时,这些不会对起始 Person 的 X-chromosome 做出贡献。
我想删除任何具有 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 证明了结果。
晚会有点晚了,思考过程与@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
这个查询只让我得到了贡献 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 传递给另一个男性(例如,儿子)。