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

55
任何在何处使用标签、节点属性和关系+节点的经验法则。
让我们举个例子,假设我有一家商店,想将我的产品放入neo4j中。它们的标识符是产品sku,我还想对它们进行分类,比如这个是服装、食品、电子产品等等。我将在图表上进行自由搜索,用户可以搜索任何东西,然后我将返回与该搜索字符串相关的所有内容。
哪种方式更好呢:
  1. 我有一个带有 sku 001 的节点,并给其打上“食品”标签。
  2. 我有一个带有 sku 001 的节点,并在此节点上拥有一个名为“category:“Food”的属性
  3. 我有一个带有 sku 001 的节点,我将为“食品”创建另一个节点,并创建一个名为“category”的关系来关联它们。
我读到过,如果要查找属性,最好使用关系+节点,因为遍历比查找节点属性要快得多。
谢谢。
2个回答

72
无论是使用属性、标签还是节点来表示类别,取决于您将如何查询数据。(假设您有一组相对较小且相对固定的类别。)
如果您不需要按类别查询,只需返回其他方式找到的节点的类别,则应使用属性。(例如:具有sku 001 的商品的类别是什么?)
如果您需要按类别查询,则应使用标签。(例如:价格低于$10的所有食品都是哪些?)
如果您需要遍历类别而又不知道是什么,则应使用节点。(例如:用户选择的某个类别中,最受欢迎的十个商品是什么?)

第三个选项最为健壮,您可以轻松地使用这种结构实现所有3个目标,并且对性能的影响最小,而不是其他2种方法。我想象一下这个问题的结构类似于:1 (:user)-[LIKES]->(:node:food {sku: 1, cost: 10})2 (:user)-[LIKES]->(:node {sku: 1, category: "food", cost: 10}),和3 (:user)-[LIKES]->(:node {sku: 1, cost: 10})-[HAS_CATEGORY]->(:Category {name: "food"}),其中第三个选项允许最容易地查询您的所有3个示例。 - ctwheels

16

这篇博客文章由于它包含的基准测试,可能也会有所帮助。

我用四种不同的方式建模了“关系”...

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

<...>

因此总结起来...特定的关系类型最好!


基准测试提供了非常好的指针 - 但它们表明使用特定关系比使用通用关系更快。使用属性 vs 标签 vs 节点的决策仍取决于查询本身。 - ahmedhosny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接