В нашей базе данных представлены отели, отзывы о гостиницах, термины (например, слова) в отзывах и темах (например, может быть тема, говорящая «Персонал», содержащая термины, описывающие персонал отеля) в качестве узлов. На всех узлах присутствуют индексы. Отношения следующим образом: Hotel < --Review -> Term -> ТемаОбразцы длинноволосого пути в neo4j
В настоящее время я пытаюсь найти эффективный способ запроса тем, у которых есть пути к двум или более указанным отелям. Другими словами, меня интересуют общие темы двух отелей. Если в отеле A есть пути к темам 1,2,3, а в отеле B есть пути к темам 2,3,4, то результат должен быть 2,3.
Я пробовал следующее ниже, но это кажется очень неэффективным, что очень вероятно из-за количества возможных путей между гостиницами и темами. В основном каждое слово в обзоре может создать новый путь, который необходимо проверить.
// show all topics that two hotels have in common
MATCH (h2:Hotel)<--(r2:Review)-->(t2:Term)-->(to:Topic)<--(t1:Term)<--(r1:Review)-->(h1:Hotel)
WHERE h1.id IN ["id1","id2"] AND h2.id IN ["id1","id2"] AND NOT h1.id=h2.id
RETURN h1.id,to.topic, count(to) AS topic_mentions
мне интересно, если есть более быстрый способ борьбы с этим, если бы я осуществить это в Java или аналогичном языке, который я бы, наверное, попробовать делать BFS, начиная с каждым отелем, а затем с перекрыванием, что Я нахожу. Я вполне уверен, что добавление переходных краев в качестве прямых ребер Hotel -> Topic ускорит это, но мои ограниченные знания по дизайну базы данных сказали мне, что это может быть излишне избыточным, а не хорошей практикой?
Я попытался выполнить идентификацию перед сопоставлением с другим предложением MATCH и WITH, но это ничего не ускорило; Я думаю, что проблема действительно в самом шаблоне.