Я пользуюсь Neo4j уже несколько недель и думаю, что это круто.
Я создаю приложение NLP, и в основном я использую Neo4j для хранения графа зависимостей, сгенерированного семантическим парсером, что-то вроде этого:
https://explosion.ai/demos/displacy?text=Hi%20dear%2C%20what%20is%20your%20name%3F&model=en_core_web_sm&cpu=1&cph=0
В узлах я храню отдельные слова, содержащиеся в предложениях, и связываю их через отношения с рядом различных типов.
Для моего приложения мне необходимо найти все узлы, которые содержатданное слово, поэтому в основном я должен искать по всем узлам, находя те, которые содержат входное слово.Конечно, я уже создал индекс для текстового поля слова.
Я работаю над очень большим набором данных:
На моем ноутбуке следующий запрос занимает около 20 мс:
MATCH (t:token) WHERE t.text="avoid" RETURN t.text
Вот подробные сведения о графе graph.db:
47.108.544 узлов
45.442.034 отношений
13.39 ГиБ дБ размер
Индекс, созданный в поле token.text
PROFILE MATCH (t:token) WHERE t.text="switch" RETURN t.text
------------------------
NodeIndexSeek
251,679 db hits
---------------
Projection
251,678 db hits
--------------
ProduceResults
251,678 db hits
---------------
Интересно, я что-то не так делаю при индексации такого количества узлов.В настоящий момент я создаю новый узел для каждого слова, с которым я сталкиваюсь в тексте, даже если текст совпадает с другими узлами.
Должен ли я создавать новый узел только при обнаружении нового слова, управляяпредложение строится на основе отношений?
Не могли бы вы помочь мне с предложением или наилучшей практикой для этого конкретного случая?
Большое спасибо