面试题答案
一键面试使用Neo4j带标签属性图模型存储关系
- 节点创建:
- 为每个用户创建一个节点,标签设为
User
,并添加用户相关属性,如name
(姓名)、city
(居住城市)等。例如:
CREATE (:User {name: 'Alice', city: 'New York'})
- 为每个用户创建一个节点,标签设为
- 关系创建:
- 对于朋友关系,创建带有
FRIEND
标签的关系。例如,如果Alice
和Bob
是朋友:
MATCH (a:User {name: 'Alice'}), (b:User {name: 'Bob'}) CREATE (a)-[:FRIEND]->(b)
- 对于同事关系,创建带有
COLLEAGUE
标签的关系。例如,如果Alice
和Charlie
是同事:
MATCH (a:User {name: 'Alice'}), (c:User {name: 'Charlie'}) CREATE (a)-[:COLLEAGUE]->(c)
- 对于校友关系,创建带有
ALUMNUS
标签的关系。例如,如果Alice
和David
是校友:
MATCH (a:User {name: 'Alice'}), (d:User {name: 'David'}) CREATE (a)-[:ALUMNUS]->(d)
- 对于朋友关系,创建带有
Cypher查询语句
查找同时是朋友和校友关系且居住在同一城市的用户对:
MATCH (a:User)-[:FRIEND]->(b:User), (a)-[:ALUMNUS]->(b)
WHERE a.city = b.city
RETURN a.name, b.name
执行优化策略
- 索引创建:
- 为
User
节点的city
属性创建索引,以加速基于城市的过滤。
CREATE INDEX ON :User(city)
- 如果
name
属性也常被用于查询,也可以为其创建索引。
CREATE INDEX ON :User(name)
- 为
- 查询计划分析:
- 使用
EXPLAIN
关键字分析查询计划,了解查询的执行方式。例如:
EXPLAIN MATCH (a:User)-[:FRIEND]->(b:User), (a)-[:ALUMNUS]->(b) WHERE a.city = b.city RETURN a.name, b.name
- 根据分析结果,优化查询。如果发现某个关系匹配或过滤操作代价高,可以调整查询结构或添加更多索引。
- 使用
- 减少数据加载:
- 在查询中仅返回需要的属性(如上述查询中仅返回
a.name
和b.name
),避免加载不必要的节点和关系属性,减少内存占用和网络传输。
- 在查询中仅返回需要的属性(如上述查询中仅返回
- 关系模式优化:
- 如果可能,在数据导入时,确保关系的方向和结构有助于查询。例如,如果查询主要关注从一个用户到另一个用户的特定关系,按照这个方向创建关系可以提高查询效率。