2016-04-08 2 views
1

В нашей базе данных представлены отели, отзывы о гостиницах, термины (например, слова) в отзывах и темах (например, может быть тема, говорящая «Персонал», содержащая термины, описывающие персонал отеля) в качестве узлов. На всех узлах присутствуют индексы. Отношения следующим образом: 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, но это ничего не ускорило; Я думаю, что проблема действительно в самом шаблоне.

ответ

1

Я создал что-то похожее для поиска KB, и прямая связь между гостиницами и темами сделает этот поиск мертвым легко, и он будет быстрее. Например, ваш поиск по всем темам с более чем одной гостиницей в общем, вы будете использовать:

MATCH (h1:Hotel)-[:TOPIC]->(t:Topic) 
MATCH (h2:Hotel)-[:TOPIC]->(t:Topic) 
WHERE h1 <> h2 
RETURN h1.id, h2.id, t.topic, count(t) AS topic_mentions 

Обратите внимание, что это вернет количество всех тем эти две гостиниц имеют в общих, которые могут или возможно, не то, что вы хотите.

Я абсолютно уверен, что добавление переходных краев в виде прямых ребер Hotel - Тема будет ускорить этот процесс, но моя ограниченная база данных дизайн знание сказал мне, что это может быть излишне избыточными и не хорошая практика?

Все, что было бы сделано, заключается в том, чтобы сделать явное выражение явным, что является одним из факторов, делающих так, чтобы график db был настолько сильным. Существует аспект обслуживания, о котором нужно беспокоиться - а именно, если кто-то обновляет слова в обзоре, тогда вы должны убедиться, что отношения (гостиница) - [: TOPIC] -> (тема) остаются в силе, но вы так или иначе, так что никаких потерь нет.

Смежные вопросы