tl; dr
neo4j是一个非常扎实的解决方案,具有许多功能和工具。
介绍
我最近加入了一个新项目,它使用Neo4j作为主要DBM。在我加入之前,我对Neo4J的了解仅限于它存在的事实。因此,今天我要告诉您我使用Neo4J作为主要存储的经验以及到目前为止所学到的。
暗号
neo4j使用cypher作为查询语言。他们说:“这就像SQL。”你没看到吗?
MATCH (abs:OrgAbstract) WHERE abs.legacyId = toInteger(55)
CREATE (s:Standard:OrgStandard { legacyId: toInteger(1), dateFrom: date('1900-01-01') })
CREATE (f:Factor:OrgFactor { legacyId:toInteger(13) })
WITH abs, s, f, split('F1;42', ';') AS typeArray
UNWIND typeArray AS type
MERGE (ft:FactorType {name: type})
MERGE (abs)-[:HAS_STANDARD]-(s)
MERGE (s)-[:HAS_FACTOR]-(f)
MERGE (f)-[:HAS_FACTOR_TYPE]-(ft)
好吧,一旦您阅读了文档并尝试一下,您就开始了解这里发生了什么。然后,它看起来很漂亮。
查询执行工具
要尝试使用Cypher查询,您需要客户,不是吗?
Intellij Idea插件
想到的第一件事是Intellij Idea插件。 2秒钟的谷歌搜索,Idea重新启动,您已经与Graph Database support plugin连接到Neo4J。
但是,使用IDE插件错误的第一次尝试使用简单查询失败:
java.lang.Throwable: class com.intellij.openapi.editor.EditorFactory it is a service, use getService instead of getComponent
至少我拥有的Intellij Idea 2022.1.4就是这种情况。
对于某些结果查询插件可行,但返回了错误的结果。
,如果您查看插件repository on github,似乎已经被放弃了 - 三年来一直没有更新。
Neo4J浏览器
neo4j带有捆绑的Neo4j Browser,您可以在其中执行查询并与图形进行交互。您甚至不需要安装任何内容,只需在浏览器中打开它,然后开始查询。
看看图视图有多惊人:
Neo4J桌面
还有Neo4j Desktop app,它是可以连接和管理您的Neo4J实例的IDE。但是我还没有尝试过。
迁移和数据访问
如果您需要模式迁移,则可以使用liquigraph或liquibase-neo4j。请注意,Liquigraph已达到生命的终结,建议迁移到Liquibase。还有一个migration utility。
有不同的选项可以在应用程序级别上访问数据。如果您使用的是弹簧,则可以使用spring-data-neo4j。另一个选择是Object Graph Mapping Library for Neo4j。当然,您可以简单地使用数据库驱动程序并直接执行Cypher查询。
社区与企业版
如果您将neo4j视为项目的数据库,则需要了解他们支持的Neo4J版本和features。
有免费的Neo4J社区版。这是NEO4J的功能齐全的版本,其中包括一个数据库。如果您正在尝试或交付非关键项目,它可以适合您。
但是,如果您想要multiple databases,clustering,backups and restore,authentication and authorization之类的功能,基于角色的访问控制,LDAP和Active Directory集成 - 它们都在Neo4J Enterprise Edition中。它是付费的。此外,您不能在几个国家购买它。因此,请确保在之前咨询文档或销售团队 您选择neo4j作为项目的数据库。否则,您最终可能需要企业版功能才能将项目发布到生产中,但是由于某种原因,您无法购买企业版。
多租户方法
如果您需要在系统中实现多重租赁,请参阅以下一些选择:
- 每个租户都有一个独立的neo4j实例。这是最明显的选择。在运营,成本等方面,您可能会有一些开销。
- 每个租户在单个NEO4J实例中都有自己的数据库。此选项仅在企业版中提供。看来这是在安全方面进行多租期的首选方法。请注意,要添加新的租户,您需要进行一些操作/开发工作:提供一个新数据库,添加一些配置以在应用程序级别上连接到该数据库,依此类推。
- 使用NEO4J授权,用户和ACL将租户分开。同样,这仅在企业版中提供。
- 每个租户只是节点上的标签。这样,您可以实现应用程序逻辑,以便添加新租户只是管理员的工作,不需要操作/开发人员工作。但是,您将需要实施一个好的解决方案,以将数据分离在应用程序级别上,以确保租户看不到彼此的数据。
- 每个租户都是一个节点,所有数据节点均连接到它。这种方法具有与上一个方法相同的好处和权衡。
这是一个很好的问题,在性能方面,最好的选择是什么,但是我还没有答案。我试图对最后两种方法进行一些沉重的疑问,而且没有明显的赢家。
,这里有几个有用的线程在neo4j论坛上的多租户:
结论
那么,我学到了什么?
我了解到,Neo4J是一个非常可靠的解决方案,具有许多功能和工具。如果您为项目选择数据库,则绝对应该将其视为一种选择。
注意。明天会更好!