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

Posted

技术标签:

【中文标题】neo4j - 标签 vs 属性 vs 关系 + 节点【英文标题】:neo4j - labels vs properties vs relationship + node 【发布时间】:2014-04-15 22:27:10 【问题描述】:

关于在哪里使用标签、节点属性和关系+节点的任何经验法则。

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

使用会更好吗:

    我有一个带有sku 001 的节点,我会将它标记为Food 的标签。 我有一个带有sku 001 的节点,并且在这个节点上有一个名为category:"Food" 的属性 我有一个带有sku 001 的节点,我将为Food 创建另一个节点,并将创建一个“category”关系来关联它们。

我已经读到,如果您要查找属性,最好使用关系 + 节点,因为遍历比查找节点的属性要快得多。

TIA

【问题讨论】:

【参考方案1】:

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

(我在这里假设您有一组相当小、相当固定的类别。)

使用属性如果你不会按类别查询,而只需要返回通过其他方式找到的节点的类别。 (例如:sku 001的商品属于什么类别?)

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

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

【讨论】:

【参考方案2】:

This blog post 可能也有帮助,因为它包含基准测试。

我用 4 种不同的方式对“关系”进行建模……

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

<...>

总之……具体的关系#ftw!

【讨论】:

基准测试给出了一个很好的指示——但它们表明使用特定关系比使用通用关系更快。他们决定使用属性、标签和节点仍然取决于查询本身。

以上是关于neo4j - 标签 vs 属性 vs 关系 + 节点的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j约束值,标签或属性

MongoDB + Neo4J vs OrientDB vs ArangoDB [关闭]

Neo4j 第二篇:图形数据库

Neo4j - Cypher vs Gremlin 查询语言

Neo4j基本操作

以属性实体 VS 作为属性 ID 的表关系