Neo4j 使用相同的名称创建标签和节点有意义吗?
例如,如果iPhone是一个品牌,而iPhone 8 Plus是一个产品,那么创建两个标签“iPhone”和“SmartPhone”是否有意义,但同时创建iPhone作为节点,因为iPhone作为一个品牌有自己的一些属性:Neo4j 使用相同的名称创建标签和节点有意义吗?,neo4j,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)-[:bra
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
或
这个设计好吗?谢谢。您应该使用诸如Smartphone之类的公共属性来命名它们,这样您就可以查询名为iphone的智能手机。它实际上取决于模式和您拥有的数据类型 例如: 如果您拥有各种不同品牌和不同级别的智能手机,那么搜索标有智能手机而不是特定品牌的节点就很容易了
希望这有帮助 除非绝对必要,否则应避免冗余。冗余需要更多的数据存储,并且会使维护数据模型更加困难,因为您必须确保冗余存储的数据始终保持一致
此外,如果您添加on:Brandname,您的最后一个Cypher示例将非常快。您的意思是将智能手机用作属性而不是标签?通过分配两个标签,iPhone和SmartPhone,我可以快速查询所有iPhone或所有智能手机。对吧?对。但不是作为财产,而是作为所有手机标签的智能手机。因为使用标签查询比查询属性更快。如果我从p:iPhone:SmartPhone{name:iPhone 8 Plus}中删除标签iPhone,我获得查询所有iPhone的唯一方法是通过第二个查询,这应该比第一个查询慢得多,即使创建了索引:Brandname?对于标签,我是否需要创建索引,就像iPhonename获得加速效果一样,或者如果我只是想返回所有iPhone,我执行Match n:iPhone return n,我是否为iPhone和SmartPhone这两个标签创建索引无关紧要?您的第二个查询稍微慢了一点,但速度应该不会太慢。如果你仍然使用标签方法,那么不需要索引就可以获得所有iPhone。
Match (p:SmartPhone)-[:brand]->(b:Brand {name:"iPhone"}) return p;