Am Sonntag, 1. August 2004 17:47 schrieb D. Richard Hipp:
> Why don't you post your complete schema (the output of the ".schema"
> command in the command-line shell) and the query that you are
> running. That will help us to better understand your problem.
I assumed I did something really stupid that anyone would spot but myself.
Here is the schema (formatted to increase readability):
-- snip --
SQLite version 2.8.15
sqlite> .schema
CREATE TABLE haploshare (id1 integer, id2 integer, locus integer,
p1p2 integer, p1m2 integer, m1p2 integer,
m1m2 integer,
FOREIGN KEY (id1) REFERENCES individuals(uniqueid),
FOREIGN KEY (id2) REFERENCES individuals(uniqueid),
FOREIGN KEY (locus) REFERENCES loci(locus));
CREATE TABLE haplotypes (individual integer,
locus integer, paternal varchar(8),
maternal varchar(8),
FOREIGN KEY (individual) REFERENCES individuals(uniqueid),
FOREIGN KEY (locus) REFERENCES loci(locus));
CREATE TABLE individuals (uniqueid integer primary key,
pedigree varchar(20),
individual varchar(20),
father varchar(20), mother varchar(20),
gender varchar(2));
CREATE TABLE loci (locus integer primary key, type integer, name varchar(20));
CREATE TABLE matched_pairs (id1 integer, id2 integer,
locus integer,
p1 varchar(8), m1 varchar(8),
p2 varchar(8), m2 varchar(8),
FOREIGN KEY (id1) REFERENCES individuals(uniqueid),
FOREIGN KEY (id2) REFERENCES individuals(uniqueid),
FOREIGNKEY (locus) REFERENCES loci(locus));
CREATE TABLE traits (individual integer, locus integer,
value double,
FOREIGN KEY (individual) REFERENCES individuals(uniqueid),
FOREIGN KEY (locus) REFERENCES loci(locus));
CREATE TABLE working_traits(individual,value);
CREATE INDEX idx_haploshare_id1 ON haploshare (id1);
CREATE INDEX idx_haploshare_id2 ON haploshare (id2);
CREATE INDEX idx_haploshare_idpairs ON haploshare (id1, id2);
CREATE UNIQUE INDEX idx_haploshare_keys ON haploshare (id1, id2, locus);
CREATE INDEX idx_haploshare_m1m2 ON haploshare (m1m2);
CREATE INDEX idx_haploshare_m1p2 ON haploshare (m1p2);
CREATE INDEX idx_haploshare_p1m2 ON haploshare (p1m2);
CREATE INDEX idx_haploshare_p1p2 ON haploshare (p1p2);
CREATE UNIQUE INDEX idx_haplotype ON haplotypes (individual, locus);
CREATE INDEX idx_results_locus ON results(locus);
CREATE INDEX idx_results_sim ON results(simulated);
CREATE UNIQUE INDEX idx_working_trait_id ON working_traits(individual);
CREATE INDEX idx_haploshare_id1id2_%s ON haploshare (id1, id2, %s)
CREATE INDEX idx_haploshare_id1id2_%s ON haploshare (id1, id2, %s)
CREATE INDEX idx_haploshare_id1id2_%s ON haploshare (id1, id2, %s)
CREATE TRIGGER haplo_share_of_m1m2 BEFORE INSERT ON haploshare
WHEN new.m1m2 == 0 OR new.m1m2 IS NULL
BEGIN
UPDATE haploshare
SET m1m2 = (SELECT count(*) FROM haploshare
WHERE m1m2 == -1 AND id1 == new.id1 AND id2 == new.id2) - 1
WHERE m1m2 == -1 AND id1 == new.id1 AND id2 == new.id2;
END;
CREATE TRIGGER haplo_share_of_m1p2 BEFORE INSERT ON haploshare
WHEN new.m1p2 == 0 OR new.m1p2 IS NULL
BEGIN
UPDATE haploshare
SET m1p2 = (SELECT count(*) FROM haploshare
WHERE m1p2 == -1 AND id1 == new.id1 AND id2 == new.id2) - 1
WHERE m1p2 == -1 AND id1 == new.id1 AND id2 == new.id2;
END;
CREATE TRIGGER haplo_share_of_p1m2 BEFORE INSERT ON haploshare
WHEN new.p1m2 == 0 OR new.p1m2 IS NULL
BEGIN
UPDATE haploshare
SET p1m2 = (SELECT count(*) FROM haploshare
WHERE p1m2 == -1 AND id1 == new.id1 AND id2 == new.id2) - 1
WHERE p1m2 == -1 AND id1 == new.id1 AND id2 == new.id2;
END;
CREATE TRIGGER haplo_share_of_p1p2 BEFORE INSERT ON haploshare
WHEN new.p1p2 == 0 OR new.p1p2 IS NULL
BEGIN
UPDATE haploshare
SET p1p2 = (SELECT count(*) FROM haploshare
WHERE p1p2 == -1 AND id1 == new.id1 AND id2 == new.id2) - 1
WHERE p1p2 == -1 AND id1 == new.id1 AND id2 == new.id2;
END;
-- snap --
At first, I need all usefull/possible pairs of id1/id2/locus, I achieve this
by:
--
INSERT INTO matched_pairs
SELECT id1.uniqueid, id2.uniqueid, hap1.locus, hap1.paternal,
hap1.maternal, hap2.paternal, hap2.maternal
FROM individuals id1
LEFT JOIN individuals id2
ON id1.uniqueid < id2.uniqueid AND id1.pedigree == id2.pedigree
LEFT JOIN haplotypes hap1
ON id1.uniqueid == hap1.individual
LEFT JOIN haplotypes hap2
ON id2.uniqueid == hap2.individual AND hap1.locus == hap2.locus
WHERE id2.uniqueid IS NOT NULL
ORDER BY id1.uniqueid, id2.uniqueid, hap1.locus;
--
Creating these pairs is quite a fast operation, less than 60 seconds for the
larger tables.
The second step is to compute the sharings, that is the number of loci which
are equivalent in a range of loci. Here are a few lines from matched_pairs:
id1|id2|locus|p1|m1|p2|m2
1 | 2 | 2 | 1| 2| 2| 2
1 | 2 | 3 | 2| 1| 1| 1
1 | 2 | 4 | 1| 1| 2| 1
1 | 2 | 5 | 1| 2| 2| 2
1 | 2 | 6 | 2| 2| 2| 2
1 | 2 | 7 | 2| 2| 2| 2
The corresponding rows in haploshare look like:
id1|id2|locus|p1p2|p1m2|m1p2|m1m2
1 | 2 | 2 | 0 | 0 | 2 | 6
1 | 2 | 2 | 0 | 0 | 2 | 6
1 | 2 | 2 | 0 | 0 | 0 | 6
1 | 2 | 2 | 0 | 0 | 3 | 6
1 | 2 | 2 | 2 | 2 | 3 | 6
1 | 2 | 2 | 2 | 2 | 3 | 6
The statement to fill in haploshare:
--
INSERT INTO haploshare
SELECT id1, id2, locus
CASE WHEN p1 == 0 OR p2 == 0 THEN NULL WHEN p1 != p2 THEN 0 ELSE -1
END,
CASE WHEN p1 == 0 OR m2 == 0 THEN NULL WHEN p1 != m2 THEN 0 ELSE -1
END,
CASE WHEN m1 == 0 OR p2 == 0 THEN NULL WHEN m1 != p2 THEN 0 ELSE -1
END,
CASE WHEN m1 == 0 OR m2 == 0 THEN NULL WHEN m1 != m2 THEN 0 ELSE -1 END
FROM matched_pairs
ORDER BY id1, id2, locus;
--
--
Dipl.-Math. (FH) Daniel Franke
Institut fuer Medizinische Biometrie und Statistik
Medizinische Universit�t zu Luebeck
Ratzeburger Allee 160, Haus 4
23538 Luebeck
Telefon: 0451-500-2786
Telefax: 0451-500-2999
[EMAIL PROTECTED]