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 关系 + 节点的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB + Neo4J vs OrientDB vs ArangoDB [关闭]