Как использовать содержит в Neo4j шифр? - PullRequest
0 голосов
/ 18 февраля 2019

Мне недавно передали базу данных Neo4j.Прочитав документы, он не кажется большим источником.Текущий Neo4j имеет 11 узлов и около нескольких сотен тысяч ребер.Я не уверен, что размер или атрибуты Neo4j замедляют обработку.

Поскольку запрос довольно большой, я опубликую его один раз в конце вопроса.

Если я использую предложение where для целей, оно дает мне результат через 7-8 секунд.

MATCH (contact:Contacts)    
where lower(contact.Name) contains lower('Rick')          
WITH contact         
ORDER BY contact.Source asc         
SKIP 0 LIMIT 20

Но тот же запрос возвращает точные результаты в течение пары миллисекунд, если используетсяследующим образом, но он возвращает только точные совпадения, а не все, которые содержат 'Rick'.

MATCH (contact:Contacts{Name:'Rick'})          
WITH contact         
ORDER BY contact.Source asc         
SKIP 0 LIMIT 20

Есть ли способ использовать contains в последнем способе, который кажется более быстрым.

Ниже приводится весь использованный запрос:

MATCH (contact:Contacts{Name:'Rick'})          
WITH contact         
ORDER BY contact.Source asc         
SKIP 0 LIMIT 20          
OPTIONAL MATCH (contact)-[workingFor:WorkingFor]->(company:Company)         
with contact, workingFor, company 
OPTIONAL MATCH (contact)-[contactForEmployee:ContactForEmployee]->(employee:Employee)        
with contact,workingFor, company, contactForEmployee, employee 
OPTIONAL MATCH (contact)-[InfoFor:InfoFor]-(LeadInfo:LeadInfo)          with contact,workingFor, company, contactForEmployee, employee, InfoFor, LeadInfo 
optional MATCH (contact)-[connectedTo:ConnectionDetails]-(contactTo:Contacts)       
where date( connectedTo.LinckedInConnectedOn) <> date('1900-01-01')       
WITH contact,connectedTo,  contactTo,  workingFor, company, contactForEmployee, employee ,InfoFor, LeadInfo       
ORDER BY connectedTo.LinckedInConnectedOn DESC  
WITH contact, collect(connectedTo)[..5] AS liConnections, collect(contactTo)[..5] AS liContacts, workingFor, company,         contactForEmployee, employee, InfoFor, LeadInfo 
optional MATCH (contact)-[ocConnections:ConnectionDetails]-(ocContactTo:Contacts)       
where ocConnections.EmailConnectionStrengthStrong <> 0 or ocConnections.EmailConnectionStrengthMedium <> 0 or ocConnections.EmailConnectionStrengthLow <> 0       
WITH contact,ocConnections, ocContactTo, liConnections, liContacts, workingFor, company,contactForEmployee, employee, InfoFor, LeadInfo       
ORDER BY ocConnections.EmailConnectionStrengthStrong desc,      ocConnections.EmailConnectionStrengthMedium desc,
 ocConnections.EmailConnectionStrengthLow desc  
WITH contact, collect(ocConnections)[..5] AS ocConnections, collect(ocContactTo)[..5] AS ocContactTo,        
 liConnections, liContacts,  workingFor, company, contactForEmployee, employee,InfoFor, LeadInfo 
RETURN contact, workingFor, company, contactForEmployee, employee,InfoFor, LeadInfo,              
 collect(liConnections) AS liConnections, collect(liContacts) AS liConnectedTo,             
 collect(ocConnections) as  ocConnections,  collect(ocContactTo) as ocConnectedTo

1 Ответ

0 голосов
/ 19 февраля 2019

CONTAINS работает с существующими индексами, за исключением того, что вы используете toLower() для свойства узла:

, где ниже (contact.Name) содержит ниже ('Rick')

Это предотвращает использование поиска по индексу: Контакты (имя), поскольку планировщик теперь преобразовывает свойство Name для всех: связывает узлы контактов в нижний регистр для выполнения проверки.

Чтобы разрешить индексищите подобные запросы, предполагая, что свойство Name чувствительно к регистру, вам может потребоваться добавить дополнительное поле только для хранения формы имени в нижнем регистре, и вы можете выполнить запрос без необходимости использовать функцию lower () длясвойство Name.

В качестве альтернативы, если вы можете выполнить обновление до Neo4j 3.5.x, у нас теперь есть индексы полнотекстовой схемы , которые предназначены для такого рода поисков и нечувствительны к регистру для поисков.

...