如何使用Neo4j cypher中包含?

问题描述 投票:0回答:1

我最近交给了一个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
neo4j graph-databases
1个回答
2
投票

CONTAINS适用于现有索引,除了您在节点属性上使用toLower()

其中lower(contact.Name)包含lower('Rick')

这可以防止使用:Contacts(Name)索引查找,因为规划器现在已将所有:Contacts节点的Name属性转换为小写以执行检查。

要允许对此类查询进行索引查找,假设Name属性区分大小写,您可能需要添加一个附加字段,仅用于保存名称的小写形式,并且您可以运行查询而无需使用lower( )Name属性上的函数。

或者,如果您可以升级到Neo4j 3.5.x,我们现在有一个fulltext schema indexes,专为这些类型的搜索而设计,并且对查找不区分大小写。

© www.soinside.com 2019 - 2024. All rights reserved.