2

遺伝的系図では、X 染色体データは特定の祖先に関連付けるのに役立ちます。これはX-DNA Inheritance Chartでよく説明されています。

私のNeo4jデータベースには、各人物のノードと、父と母のそれらを結ぶ関係があります。各ノードにはプロパティ sex (Person の性別 M または F) があります。女性は、両親のどちらかから 1 つずつ、合計 2 つの X 染色体を持っています。男性は、常に母親から X 染色体を 1 つ持っています。

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 ( 2 つの M が連続して一緒に)、これらが開始者の 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

男性は自分の X を別の男性 (息子など) に伝えることができないため、性別のコレクションは世代ごとに性別を追加し、MM を除外するようにフィルター処理されます。

于 2016-03-06T22:23:34.983 に答える