you just forgot to create an index/constraint
create index on :ORGANISM(gene_A);
but it might be that your subselection by gene_A is too broad so you get hundreds of millions of paths.
How selective is (o1:ORGANISM{gene_A:"Yes"}) ???
if it is very selective, try adding both to your original query
USING INDEX o1:ORGANISM(gene_A)
USING INDEX o2:ORGANISM(gene_A)
add the correct relationship-types to your patten
you can also profile your query by prefixing it with PROFILE
you don't need the distinct if you already aggregate
MATCH (o1:ORGANISM{gene_A:"Yes"})<-[:TYPE???]-(p1:PROTEIN)-
[:TYPE???]->(pf:PFAM)<-[:TYPE???]-(p2:PROTEIN)-[:TYPE???]->(o2:ORGANISM{gene_A:"Yes"})
RETURN pf.name,pf.description, COUNT(DISTINCT o1.name) as Weight
and you can split up your pattern a bit
MATCH (o1:ORGANISM{gene_A:"Yes"})<-[:TYPE???]-(p1:PROTEIN)
WITH distinct o1,p1
MATCH (p1)-
[:TYPE???]->(pf:PFAM)
WITH distinct o1, pf
MATCH (pf)<-[:TYPE???]-(p2:PROTEIN)
WITH distinct o1,pf,p2
MATCH (p2)-[:TYPE???]->(o2:ORGANISM{gene_A:"Yes"})