Neo4j 一个节点来收集它们
比如说我在管理收藏品。我有数以千计的棒球交易卡,数以千计的游戏卡(想想魔术:聚会),然后是成千上万的玩具 我在关系数据库中沉迷了20多年,对成千上万的Neo4J节点漂浮在太空中的想法感到不舒服 所以我倾向于用一个节点来收集它们,比如(:棒球卡),(:MTG卡),当然还有(:doiles)。他们的想法是这些都是单身 现在,如果我想要所有棒球卡,可能涉及某个球员,我可以这样做:Neo4j 一个节点来收集它们,neo4j,Neo4j,比如说我在管理收藏品。我有数以千计的棒球交易卡,数以千计的游戏卡(想想魔术:聚会),然后是成千上万的玩具 我在关系数据库中沉迷了20多年,对成千上万的Neo4J节点漂浮在太空中的想法感到不舒服 所以我倾向于用一个节点来收集它们,比如(:棒球卡),(:MTG卡),当然还有(:doiles)。他们的想法是这些都是单身 现在,如果我想要所有棒球卡,可能涉及某个球员,我可以这样做: (:BASEBALL_CARDS)-[GATHERS]->(:BASEBALL_CARD)-[:FEATURES]-
(:BASEBALL_CARDS)-[GATHERS]->(:BASEBALL_CARD)-[:FEATURES]->(p:PLAYER {name: '...'})
拥有:Basketball_CARDS单例是一件非常令人欣慰的事情,但它是否比索引:Basketball_CARD能完成的更多
(:BASEBALL_CARD)-[:FEATURES]->(p:PLAYER {name: '...'})
拥有数千个自由分布的节点是最佳实践吗?图形数据库的一个特殊优点是本地查询:关系存在于实例中,而不是类型中。一个特殊的挑战(除了良好的建模)是确定本地查询的起点(并使其保持本地,即避免路径爆炸)。在Neo4j 1.x中,一个节点是实现某种查询起点的一种方式。随着2.x和标签的引入,索引
:BaseballCard
是实现这一目标的标准方法。如果一个节点的目的是作为示例中查询类型的起点,那么最好使用标签索引。在1.x中,一个常见的问题是,一个节点具有越来越多的相同类型和方向的关系,最终会成为遍历的瓶颈。人们开始将一个节点划分为几个分页的节点,比如
(:BaseballCards)-[:GATHERS]->(:BaseballCards1to10000)-[:GATHERS]->(:BaseballCard)
与少数节点相比,标签(可能与基本的、普通的本地遍历相结合)通常更好地服务于查找本地查询起点的目的。再说一次,若有这样一个节点能安抚你们的神经或满足你们史诗般的感觉,那个么一定要拥有它。由于查询的局部性,它不会对您造成任何伤害
但是,在您的示例中,:BaseballCard
上的一个节点或索引都不能作为本地查询的起点。最特别的兴趣模式是玩家的名字。如果在name
上索引(:Player)
,您将获得最佳起点。遍历一个或几个*的[:FEATURES]
关系非常便宜,只需在另一端对:BaseballCard
标签进行一次简单的测试,就完成了。您当然可以为所有共享名称的玩家维护一个节点
以我最谦虚的看法,没有什么不舒服的必要。然而,我确实想肯定并赞扬你在这方面的不安:图形对于连接的数据来说是最强大的。收集棒球卡的特殊联系似乎不会增加新的理解或提高性能,但只要有断开的数据,就有可能发现令人兴奋和有意义的模式。也许在未来,这些卡片将通过表示其价值范围、层压质量、或先前所有者的链接列表、或它们在约会中作为对话开始者的工作情况的模式进行连接。缺少关系是一个寻找缺失的链接的过程,它为您的数据带来了巨大的洞察力和价值
*假设不止一张棒球卡上有同一名球员,或者一些棒球球员也出现在魔术卡上:聚会。我在这两个领域都是文盲,所以我想至少考虑到这种可能性。具有讽刺意味的是,当graph DBs背后的整个思想是将节点之间的连接作为一级DB构造时,您关心节点“漂浮在空间中” 但我认为您真正关心的是节点不“属于表”(用关系数据库的说法)。因此,在创建一个特殊的单例节点时,您会感觉更舒服,在某种意义上,它取代了表,您可以从表中访问应该属于该表的所有节点
节点
标签
可以看作是“表名”的等价物。因此,您不仅不需要创建一个单例“表节点”,这样做会浪费数据库资源,并且会使查询变得复杂和缓慢。neo4j可以快速访问具有相同标签的所有节点。嘿,这不像我接受过培训或其他什么:-D