创建标签和具有相同名称的节点是否有意义?

时间:2018-02-13 06:38:56

标签: neo4j

例如,如果iPhone是一个品牌,而iPhone 8 Plus是产品,那么创建两个标签' iPhone' &安培; ' SmartPhone',但同时创建iPhone作为节点,因为iPhone作为一个品牌有自己的一些属性:

create (p:iPhone:SmartPhone {name:"iPhone 8 Plus"}),
       (b:Brand {name:"iPhone", developer:"Apple", release:"2007"}),
       (p)-[:brand]->(b)

听起来多余吗?因为" iPhone"用作标签和节点名称。要查找所有iPhone,我可以:

Match (n:iPhone) return n

 Match (p:SmartPhone)-[:brand]->(b:Brand {name:"iPhone"}) return p;

这是一个好设计吗?感谢。

2 个答案:

答案 0 :(得分:1)

您应该使用#34; Smartphone"这样的公共属性来命名它们,以便您可以查询名称为iphone的智能手机。它实际上取决于架构和您拥有的数据类型。

例如: 如果您拥有不同品牌和不同级别的各种智能手机,那么搜索标有smartphone而非特定品牌的节点会很容易。

希望这有帮助!

答案 1 :(得分:0)

除非绝对必要,否则应避免冗余。冗余需要更多的数据存储,并且可能使维护数据模型变得更加困难,因为您必须确保冗余存储的数据始终保持一致。

此外,如果您在:Brand(name)上添加index,那么您的上一个Cypher示例将会很快。