图数据库模式设计 - 这适合 neo4j 吗?
Graph database schema design - Is this suitable for neo4j?
场景:一个简单的地址簿,用户可以在其中创建自己的联系人并通过将他们添加到组中来组织他们。一个联系人可能有多个地址。
我创建了下图:
![架构设计][1]
我想查询属于x组,居住在y国的所有联系人。
这种模式设计是否足以满足这些目的(我想使用 neo4j 数据库)?
看起来 country
的概念应该是图表中的第一个 class 公民,因为您的查询依赖于它。图模型设计通常会受到查询模式的很大影响。
所以我建议为每个国家/地区设置一个标记为 Country
的节点,并将具有 :LOCATED_IN
关系的 Address
节点连接到该国家/地区。 (因此从地址节点中删除国家 属性)。
有了这个改变,您的查询就像:
MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->()-[:LOCATED_IN]->(:Country{name:'US'})
RETURN contact
正如 stefan Armbruster 所指出的,一种选择是从国家/地区地址获取另一个节点。如果不想改变数据结构,只需要在Address的字段"country"上加一个索引即可。然后就可以查询了
MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->(:Address{country:'US'})
场景:一个简单的地址簿,用户可以在其中创建自己的联系人并通过将他们添加到组中来组织他们。一个联系人可能有多个地址。
我创建了下图: ![架构设计][1]
我想查询属于x组,居住在y国的所有联系人。
这种模式设计是否足以满足这些目的(我想使用 neo4j 数据库)?
看起来 country
的概念应该是图表中的第一个 class 公民,因为您的查询依赖于它。图模型设计通常会受到查询模式的很大影响。
所以我建议为每个国家/地区设置一个标记为 Country
的节点,并将具有 :LOCATED_IN
关系的 Address
节点连接到该国家/地区。 (因此从地址节点中删除国家 属性)。
有了这个改变,您的查询就像:
MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->()-[:LOCATED_IN]->(:Country{name:'US'})
RETURN contact
正如 stefan Armbruster 所指出的,一种选择是从国家/地区地址获取另一个节点。如果不想改变数据结构,只需要在Address的字段"country"上加一个索引即可。然后就可以查询了
MATCH (:Group{name:'family'})<-[:placed_in_group]-(contact)-[:lives-at]->(:Address{country:'US'})