如何在Neo4j cypher中使用contains?

如何在Neo4j cypher中使用contains?,neo4j,graph-databases,Neo4j,Graph Databases,我最近收到了一个Neo4j数据库。在阅读了这些文件之后,它似乎不是一个很大的来源。目前的Neo4j有11个节点和大约几十万条边。我不确定Neo4j的尺寸或属性是否会减慢处理速度 由于这个查询非常大,我将在问题的末尾发布一次 如果我使用where子句用于contains,它会在7-8秒内给出结果 MATCH (contact:Contacts) where lower(contact.Name) contains lower('Rick') WITH contact

我最近收到了一个Neo4j数据库。在阅读了这些文件之后,它似乎不是一个很大的来源。目前的Neo4j有11个节点和大约几十万条边。我不确定Neo4j的尺寸或属性是否会减慢处理速度

由于这个查询非常大,我将在问题的末尾发布一次

如果我使用where子句用于contains,它会在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
匹配(联系人:联系人{Name:'Rick'})
接触
按联系人订购。来源asc
跳过0限制20
可选匹配(联系人)-[workingFor:workingFor]->(公司:公司)
有联系人、为公司工作
可选匹配(联系人)-[contactForEmployee:contactForEmployee]->(员工:员工)
与联系人、工作对象、公司、联系人、雇员
可选匹配(联系人)-[InfoFor:InfoFor]-(LeadInfo:LeadInfo)与联系人、工作对象、公司、联系人、雇员、InfoFor、LeadInfo
可选匹配(联系人)-[connectedTo:ConnectionDetails]-(联系人:联系人)
其中日期(连接到LinckedInConnectedOn)日期('1900-01-01')
与联系人、已连接到、联系人到、为公司工作、联系人员工、员工、InfoFor、LeadInfo
订单由connectedTo.LinckedInConnectedOn描述
使用contact,收集(连接到)[…5]作为liConnections,收集(连接到)[…5]作为liContacts,Working for,company,contactForEmployee,employee,InfoFor,LeadInfo
可选匹配(触点)-[ocConnections:ConnectionDetails]-(ocContactTo:Contacts)
其中ocConnections.emailconnectionstrength 0或ocConnections.emailconnectionstrength媒体0或ocConnections.emailconnectionstrength低0
联系人、ocConnections、ocContactTo、liConnections、liContacts、workingFor、company、contactForEmployee、employee、InfoFor、LeadInfo
按ocConnections.EmailConnections订购加强描述,ocConnections.EmailConnections加强描述,
ocConnections.EmailConnections增强描述
使用contact时,将(ocConnections)[…5]收集为ocConnections,将(ocContactTo)[…5]收集为ocContactTo,
liConnections,liContacts,workingFor,company,contactForEmployee,employee,InfoFor,LeadInfo
返回联系人、工作对象、公司、contactForEmployee、员工、InfoFor、LeadInfo、,
将(liConnections)收集为liConnections,将(liContacts)收集为liConnectedTo,
收集(ocConnections)作为ocConnections,收集(ocContactTo)作为ocConnectedTo

包含对现有索引的操作,但您在节点属性上使用的是
toLower()

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

这将防止使用:Contacts(Name)索引查找,因为计划者现在已将all:Contacts节点的
Name
属性转换为小写以执行检查

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


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

包含对现有索引的操作,但您在节点属性上使用的是
toLower()

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

这将防止使用:Contacts(Name)索引查找,因为计划者现在已将all:Contacts节点的
Name
属性转换为小写以执行检查

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


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

据我所知,我目前正在尝试使用toLower(),没有办法让它更快?问题是“name”属性来自用户,因此可以将其作为“RiCk”输入。最终,我要么根据当前的Neo4j存储标准转换输入,要么升级到3.5.Yes,不过如果需要保留原始输入,可以添加一个额外的字段来存储该字段的小写版本(然后为该字段添加索引)当然,您可以使用regex操作符进行不区分大小写的包含搜索,但这不会使用索引。不过,它可能比您当前的方法快一点:`WHERE contact.name=~'(?i)。*'+$searchString+'.*'据我所知,我目前正在尝试使用toLower(),没有办法让它更快?问题是“name”属性来自用户,因此可以将其作为“RiCk”输入。最终,我要么根据当前的Neo4j存储标准转换输入,要么升级到3.5.Yes,不过如果需要保留原始输入,可以添加一个额外的字段来存储该字段的小写版本(然后为该字段添加索引)当然,您可以使用regex操作符进行不区分大小写的包含搜索,但这不会使用索引。它可能比您当前的方法快一点:`WHERE contact.name=~'(?i)。*'+$searchString+'.'