Я пытаюсь создать приложение в spring-neo4j, используя графический репозиторий. Одним из требований является нахождение младшего общего предка (lca) между двумя дочерними узлами.
В настоящее время я использую следующий запрос для достижения этой цели:
@Query("MATCH path = (c1:Concept)-[r:Relation*{type: 'Is a'}]->(ca:Concept)<-[r:Relation*{type: 'Is a'}]-(c2:Concept)
WHERE c1.conceptID = {conceptId1} AND c2.conceptID = {conceptId2}
RETURN ca ORDER BY length(path) LIMIT 1")
Concept findLowestCommonAncestor(@Param("conceptId1") Long conceptId1, @Param("conceptId2") Long conceptId2);
Проблема здесь в производительности. Изначально мой граф состоял из 330 000 узлов и 2 000 000 отношений. Интересующие меня отношения имеют тип: "Is a". Они перемещаются только вверх по дереву (соединяя дочерние узлы с родительскими узлами). Максимальное расстояние вверх — 3.
Это древовидная структура:
Поскольку у меня есть несколько древовидных структур, подобных этой, я решил добавить корневой узел, соединяющий все различные древовидные структуры вместе. Так что ЛКА всегда найдется. Но добавление этого корневого узла резко изменило мою производительность: с 558 мс до 562286 мс.
Я знаю, что добавление корневого узла повлияет на производительность, но это не должно быть так сильно, верно? И если да, то есть ли лучший способ рассчитать lca?
Я бы подумал, что мой шифрованный запрос будет искать только узлы вверх по дереву. Таким образом, в этом случае добавление дополнительного корневого узла не должно сильно влиять на производительность.
:Relation
? - person Supamiu   schedule 23.02.2016