neo4j - 标签vs属性vs关系+节点

时间:2014-03-12 01:56:35

标签: modeling node-neo4j neo4j

关于使用标签与节点属性与关系+节点的位置的任何经验法则。

我们有一个例子,说我有一个商店,我想把我的产品放在neo4j。他们的标识符是产品sku,我也希望对它们进行分类,就像这个用于衣服,食品,电子产品,你就明白了。我将在我的图表上进行免费搜索,就像用户可以搜索任何内容一样,并且我将返回与该搜索字符串相关的所有内容。

使用是否更好:

  1. 我有一个sku 001的节点,我会将其标记为Food
  2. 我有一个sku 001的节点,并且在此节点上拥有名为category:"Food"
  3. 的属性
  4. 我有一个sku 001的节点,我将为Food创建另一个节点,并创建一个“category”关系来关联它们。
  5. 我已经读过,如果你要查找属性,最好将它作为关系+节点,因为遍历比查找节点属性要快得多。

    TIA

2 个答案:

答案 0 :(得分:53)

是否应该使用属性,标签或类别的节点取决于您将如何查询数据。

(我在这里假设你有一套相当小的,相当固定的类别。)

如果您不按类别查询,则使用属性,但只需要返回通过其他方式找到的节点的类别。 (例如:具有sku 001的项目的类别是什么?)

如果您需要按类别查询,请使用标签。 (例如:所有食品的价格都低于10美元?)

如果您需要遍历该类别而不知道它是什么,请使用节点。 (例如:与用户选择的同一类别中十个最受欢迎的项目是什么?)

答案 1 :(得分:8)

This blog post因其包含的基准而可能也会有所帮助。

  

我用4种不同的方式塑造了'关系'......

     
      
  • 使用特定关系类型(node)-[:HAS_ADDRESS]->(address)
  •   
  • 使用通用关系类型,然后按端节点标签(node)-[:HAS]->(address:Address)
  • 进行过滤   
  • 使用通用关系类型,然后按关系属性(node)-[:HAS {type:“address”}]->(address)
  • 进行过滤   
  • 使用通用关系类型,然后按端节点属性(node)-[:HAS]->(address {type: “address”})
  • 进行过滤   
     

< ...>

     

总结......特定关系#ftw!