Я построил базу данных Neo4j, содержащую около 50 000 узлов с меткой DIAGNOSE, каждая из которых имеет свойство TEXT с длиной до 50 символов. В той же базе данных графа содержится около 120 000 узлов с меткой BASETEXT, каждая из которых имеет свойство string TEXTVALUE с числом символов до 175 000 символов. Моя цель - создать связь (b: BASETEXT) - [: ASSOCIATED] -> (d: DIAGNOSE) в случае, если DIAGNOSE.TEXT включен в BASETEXT.TEXTVALUE - в результате получается всего около 2.9 * 10^9 запросов. Я попытался следующие два подхода шифра:создание отношений через полнотекстовый поиск в Neo4J
подход 1:
match (b:BASETEXT), (d:DIAGNOSE)
where b.TEXTVALUE =~ (".* " + d.TEXT + " .*")
merge (b) -[:ASSOCIATED]-> (d);
подход 2 (создать связь между каждым Диагностировать узел и каждый BASETEXT узел, если текст в TEXTVALUE присвоить истинное значение для отношений собственности, СОДЕРЖАЩИМСЯ , в противном случае значение лОЖЬ, наконец, удалить все отношения с ASSOCIATED.CONTAINED = ложным):
match (b:BASETEXT), (d:DIAGNOSE)
where not (b) -[:ASSOCIATED]-> (d)
with b, d limit 20000
create (b) -[a:ASSOCIATED]-> (d)
with b, d, a
set a.CONTAINED =
case
when (b.TEXTVALUE =~ (".* " + d.TEXT + " .*")) then true
else false
end
return count(a);
Ни один из упомянутых выше подходов работ. Подход 1 не находит конца в течение получаса, подход 2 находит конец, но мне потребуется 60 дней. Любые предложения по правильному внедрению текстового поиска в Neo4J и решению проблемы - желательно в Cypher?
Не используйте regex, но используйте индексы наследия Lucene для полнотекстового поиска: см., например. http://jexp.de/blog/2014/03/full-text-indexing-fts-in-neo4j-2-0/ – tstorms
был вебинар по классификации документов, записанный на http://player.vimeo.com/видео/105266385. Наверное, это похоже на ваш случай использования. –