neo4j - Filtering out nodes based on outgoing relationship in Cypher query (Similar to SQL outer join) -
i have simple database 3 types of nodes (t:transcripts, f:protein families , g:genes. there 2 types of relationships, pfam_mrna (t)-[r]->(f) , parent (t)-[p]->(g).
(g:gene{name:'g1'})<-[p:parent]-(t:transcript{name:'t1'}) (g:gene{name:'g1'})<-[p:parent]-(t:transcript{name:'t2'}) (g:gene{name:'g2'})<-[p:parent]-(t:transcript{name:'t3'}) (g:gene{name:'g3'})<-[p:parent]-(t:transcript{name:'t4'}) (g:gene{name:'g4'})<-[p:parent]-(t:transcript{name:'t5'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t1'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t2'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t3'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t4'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t5'}) (f:pfam{id:'pf1040'})<-[r:pfam_mrna]-(t:transcript{name:'t4'}) (f:pfam{id:'pf1040'})<-[r:pfam_mrna]-(t:transcript{name:'t5'}) next, trying transcripts (and parent genes) connected pf0752 rid of transcripts (and parent genes) connected pf1040.
so, cypher query looks like
match (f)<-[rel:pfam_mrna]-(t)-[p:parent]->(g) f.id in ['pf0752'] , not f.id in ['pf1040'] return * however, got graph like
(g:gene{name:'g1'})<-[p:parent]-(t:transcript{name:'t1'}) (g:gene{name:'g1'})<-[p:parent]-(t:transcript{name:'t2'}) (g:gene{name:'g2'})<-[p:parent]-(t:transcript{name:'t3'}) (g:gene{name:'g3'})<-[p:parent]-(t:transcript{name:'t4'}) (g:gene{name:'g4'})<-[p:parent]-(t:transcript{name:'t5'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t1'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t2'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t3'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t4'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t5'}) instead of
(g:gene{name:'g1'})<-[p:parent]-(t:transcript{name:'t1'}) (g:gene{name:'g1'})<-[p:parent]-(t:transcript{name:'t2'}) (g:gene{name:'g2'})<-[p:parent]-(t:transcript{name:'t3'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t1'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t2'}) (f:pfam{id:'pf0752'})<-[r:pfam_mrna]-(t:transcript{name:'t3'}) any hint/idea of how make works appreciated.
thanks,
you can add where not clause on pattern t pf1040 protein:
match (f:pfam {id: 'pf0752'}), (pf:pfam {id:'pf1040'}) match (f)<-[rel:pfam_mrna]-(t)-[p:parent]->(g) not (pf)<-[:pfam_mrna]-(t) return *
Comments
Post a Comment