Я пытаюсь выполнить этот запрос с использованием Neo4j, но он выполняется слишком долго (более 30 минут, для почти 2500 узлов и 1,8 миллиона отношений):
Match (a:Art)-[r1]->(b:Art)
with collect({start:a.url,end:b.url,score:r1.ed_sc}) as row1
MATCH (a:Art)-[r1]->(b:Art)-[r2]->(c:Art)
Where a.url<>c.url
with row1 + collect({start:a.url,end:c.url,score:r1.ed_sc*r2.ed_sc}) as row2
Match (a:Art)-[r1]->(b:Art)-[r2]->(c:Art)-[r3]->(d:Art)
WHERE a.url<>c.url and b.url<>d.url and a.url<>d.url
with row2+collect({start:a.url,end:d.url,score:r1.ed_sc*r2.ed_sc*r3.ed_sc}) as allRows
unwind allRows as row
RETURN row.start as start ,row.end as end , sum(row.score) as final_score limit 10;
Здесь :Art
- этометка, под которой находится 2500 узлов, и между этими узлами существуют двунаправленные отношения, свойство которых называется ed_sc
.Поэтому в основном я пытаюсь найти оценку между двумя узлами путем обхода путей на одну, две и три градуса, а затем суммировать эти оценки.
Есть ли более оптимизированный способ сделать это?