neo4j OR查询比AND查询慢吗?

  • 本文关键字:查询 OR neo4j AND neo4j
  • 更新时间 :
  • 英文 :


我是neo4j的新手,正在尝试在其中存储用户信息。我正在创建名为Person的节点,我在其中存储简单的属性,如用户名preferredLanguage等。对于复杂的属性,如addressphone等,我使用单独的节点。示例如下:

CREATE (m1:email { value: 'user1@company.com', type: 'work', primary: true })
CREATE (m2:email { value: 'user1@gmail.com', type: 'home' })
CREATE (m3:email { value: 'user1@yahoo.com', type: 'home' })
CREATE (ph1:phone { value: '1111111111', type: 'mobile' })
CREATE (ph2:phone { value: '2222222222', type: 'work' })
CREATE (p:Person { username: 'user1', phone: preferredLanguage: 'English'})
CREATE (p) - [: email] -> (m1)
CREATE (p) - [: email] -> (m2)
CREATE (p) - [: email] -> (m3)
CREATE (p) - [: phone] -> (ph1)
CREATE (p) - [: phone] -> (ph2)

我已经创建了一百万个这样的用户,并索引了所有类型节点的所有属性。我正在尝试对这些数据进行不同类型的搜索。考虑下面的查询:

MATCH (p: Person) - [: phone] -> (ph: phone)
MATCH (p) - [: email] -> (e: email)
WHERE e.value = 'user1@gmail.com' AND ph.value = '1111111111'
RETURN DISTINCT p.username

这个过程完成得非常快——大约100毫秒。返回1个用户

现在考虑以下查询:

MATCH (p: Person) - [: phone] -> (ph: phone)
MATCH (p) - [: email] -> (e: email)
WHERE e.value = 'user1@gmail.com' OR ph.value = '3333333333'
RETURN DISTINCT p.username

该查询大约需要6秒才能完成,并返回两个用户。我怎样才能使它更快呢?

试试这个:

MATCH (ph) WHERE (ph:phone OR ph:email) AND (ph.value = '3333333333' 
OR ph.value = 'user1@gmail.com')
MATCH (p:Person) WHERE (p)-[:phone]->(ph) OR (p)-[:email]->(ph) 
RETURN DISTINCT p.username

在这里,我们首先得到必要的phoneemail节点,然后是person节点,与它们中的任何一个链接。

你也可以简化一下你的查询,像这样:

MATCH (p:Person)-[:phone]->(ph)
MATCH (p)-[:email]->(e)
WHERE e.value = 'user1@gmail.com' OR ph.value = '3333333333'
RETURN DISTINCT p.username

相关内容

  • 没有找到相关文章

最新更新