我是neo4j的新手,正在尝试在其中存储用户信息。我正在创建名为Person的节点,我在其中存储简单的属性,如用户名,preferredLanguage等。对于复杂的属性,如address,phone等,我使用单独的节点。示例如下:
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
在这里,我们首先得到必要的phone
和email
节点,然后是person
节点,与它们中的任何一个链接。
你也可以简化一下你的查询,像这样:
MATCH (p:Person)-[:phone]->(ph)
MATCH (p)-[:email]->(e)
WHERE e.value = 'user1@gmail.com' OR ph.value = '3333333333'
RETURN DISTINCT p.username