我最近交给了一个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
CONTAINS适用于现有索引,除了您在节点属性上使用toLower()
:
其中lower(contact.Name)包含lower('Rick')
这可以防止使用:Contacts(Name)索引查找,因为规划器现在已将所有:Contacts节点的Name
属性转换为小写以执行检查。
要允许对此类查询进行索引查找,假设Name属性区分大小写,您可能需要添加一个附加字段,仅用于保存名称的小写形式,并且您可以运行查询而无需使用lower( )Name属性上的函数。
或者,如果您可以升级到Neo4j 3.5.x,我们现在有一个fulltext schema indexes,专为这些类型的搜索而设计,并且对查找不区分大小写。