У меня есть база данных графиков в Neo4j с информацией о наркотиках и взаимодействиях между наркотиками и другими. В связи с этим ()-[:IS_PARTICIPANT_IN]->()
связывает лекарство с взаимодействием. Мне нужно получить те пары лекарств a
и b
, которые не участвуют ни в каких других отношениях :IS_PARTICIPANT_IN
, кроме тех, которые между ними, то есть (a)-[:IS_PARTICIPANT_IN]->(ddi:DrugDrugInteraction)<-[:IS_PARTICIPANT_IN]-(b)
, без каких-либо других отношений IS_PARTICIPANT_IN
, в которых нет ни a
ни b
.
Для этой цели я попытался выполнить следующий запрос Cypher. Однако в конечном итоге он достигает размера кучи (увеличивается до 8 ГБ), поскольку операции сбора занимают слишком много памяти.
MATCH (drug1:Drug)-[r1:IS_PARTICIPANT_IN]->(ddi:DrugDrugInteraction)
MATCH (drug2:Drug)-[r2:IS_PARTICIPANT_IN]->(ddi)
WHERE drug1 <> drug2
OPTIONAL MATCH (drug2)-[r3:IS_PARTICIPANT_IN]->(furtherDDI:DrugDrugInteraction)
WHERE furtherDDI <> ddi
WITH drug1, drug2, ddi, COLLECT(ddi) AS ddis, furtherDDI, COLLECT(furtherDDI) AS additionalDDIs
WITH drug1, drug2, ddi, COUNT(ddis) AS n1, COUNT(additionalDDIs) AS n2
WHERE n1 = 1 AND n2 = 0
RETURN drug1.name, drug2.name, ddi.name ORDER BY drug1;
Как улучшить код, чтобы получить желаемые результаты, не превышая размер кучи предел?