我有这样的数据模型:
每个人都可以拥有一个电子邮件和LISTS多个电子邮件(如联系人列表,每个人都有200个联系人)。
我正在尝试执行的查询是查找所有拥有联系人LISTS的电子邮件的人,并在他们之间建立知识关系。
MATCH (n:Person {uid:'123'}) -[r1:LISTS]-> (m:Email) <-[r2:OWNS]- (l:Person)
CREATE UNIQUE (n)-[:KNOWS]->[l]
我当前数据库的计数如下:
现在我的问题是在这个当前数据库上运行上述查询需要4.3到4.8秒之间的时间,这对我的需求来说是不可接受的。我想知道这是考虑我的数据模型的正常时间,还是我对查询(甚至模型)做错了。
非常感谢任何帮助。此外,如果这对Neo4j来说是正常的,请随意建议其他图形数据库,以便更好地处理这种模型。
非常感谢您提前
更新:
我的查询是:profile match (n: {uid: '4692'}) -[:LISTS]-> (:Email) <-[:OWNS]- (l) create unique (n)-[r:KNOWS]->(l)
我查询的PROFILE命令返回:
Cypher version: CYPHER 2.2, planner: RULE. 3919222 total db hits in 2713 ms.
答案 0 :(得分:1)
是的,从索引中匹配一个人及其&lt; = 100个列出的电子邮件地址并将用户与每个电子邮件的单个所有者之间的关系合并的4.5秒是很慢的。
首先要确保在uid
标签的节点上有:Person
属性的索引。使用SCHEMA
命令检查索引,如果缺少,请使用CREATE INDEX ON :Person(uid)
创建这样的索引。
其次,CREATE UNIQUE
可能会或可能不会正常工作,但您会想要使用MERGE
。 CREATE UNIQUE
已弃用,虽然它们有时相同,但您要执行的操作应使用MERGE
表示。
第三,要找出查询速度慢的原因,您可以对其进行分析:
PROFILE
MATCH (n:Person {uid:'123'})-[:LISTS]->(m:Email)<-[:OWNS]-(l:Person)
MERGE (n)-[:KNOWS]->[l]
有关详细信息,请参阅1,2。您可能还希望在强制使用一个或多个基于成本和规则的查询规划器来比较其计划时对您的查询进行概要分析。
CYPHER planner=cost
PROFILE
MATCH (n:Person {uid:'123'})-[:LISTS]->(m:Email)<-[:OWNS]-(l:Person)
MERGE (n)-[:KNOWS]->[l]
有了这些,您可以找到并纠正问题,或者使用这些信息更新您的问题,以帮助其他人帮助您找到问题。