【发布时间】:2015-04-01 07:50:08
【问题描述】:
场景:一个简单的地址簿,用户可以在其中创建自己的联系人并通过将他们添加到组中来组织他们。一个联系人可能有多个地址。
我创建了以下图表: ![模式设计][1]
我想查询所有放在 x 组并且居住在 y 国的联系人。
这种架构设计是否足以满足这些目的(我想使用 neo4j 数据库)?
【问题讨论】:
标签: database neo4j database-schema graph-databases schema-design
场景:一个简单的地址簿,用户可以在其中创建自己的联系人并通过将他们添加到组中来组织他们。一个联系人可能有多个地址。
我创建了以下图表: ![模式设计][1]
我想查询所有放在 x 组并且居住在 y 国的联系人。
这种架构设计是否足以满足这些目的(我想使用 neo4j 数据库)?
【问题讨论】:
标签: database neo4j database-schema graph-databases schema-design
看起来country 的概念应该是图表中的一等公民,因为您的查询依赖于它。图模型设计通常会受到查询模式的很大影响。
所以我建议为每个国家/地区设置一个标记为Country 的节点,并将Address 节点与:LOCATED_IN 关系连接到该国家/地区。 (因此从地址节点中删除国家属性)。
有了这个改变,你的查询就很简单了:
MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->()-[:LOCATED_IN]->(:Country{name:'US'})
RETURN contact
【讨论】:
Prop 属性的节点(可能也对其进行了索引),我正在查询数据库只是为了找到所有具有 Prop 的节点,然后过滤具体的 Prop 值(可能的 Prop 值的数量相当小:我可以将它们全部枚举(比如 1000 个可能的值))。如果我创建一个标签Prop 并与之创建 20K 关系,那会是更好的设计吗?在性能方面什么是更好的选择?
正如 stefan Armbruster 所指出的,一种选择是从国家地址获得另一个节点。如果您不想更改数据结构,只需在地址的“国家/地区”字段中添加索引即可。然后就可以查询了
MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->(:Address{country:'US'})
【讨论】: