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

Popular posts from this blog

javascript - Bootstrap Popover: iOS Safari strange behaviour -

Magento/PHP - Get phones on all members in a customer group -

session - Logging Out Using PHP -