c# - 针对 C# 开发人员的 Neo4j 和 MSSQL 实用性能比较

标签 c# sql-server neo4j neo4jclient entity-framework-6.1

假设我们有一个带有小型社交图谱的网站,人们(比如大约 100 万用户)可以“喜欢”某些东西、互相关注、评论彼此的帖子以及......(通常的情况)。

在 .NET 中,我们有两个选择:

  1. 使用 EF(当前为 6.1)和 MSSQL(v2012 或更高版本)实现社交图谱(困难的方法)
  2. 使用 Neo4j(当前为 2.1.4)和 Neo4jClient(据我所知,这是最适合 .NET 用户的驱动程序)

考虑到上述场景以及 Neo4j 没有 .NET 的 native 驱动程序,并且当前版本的 Neo4jClient (1.0.0.657) 使用 REST api 连接到数据库引擎,对于问题,哪一个会更快例如“谁喜欢像我一样的东西”或“一个人会喜欢什么(基于其关注的人)”以及其他一些有关社交图谱的常见问题?

最佳答案

您还没有指定那么多信息;你的问题可能会引起很多意见,但我会尽力公平地对待这个问题。 (免责声明:我来自 Neo4j 方面,但我已经处理过你提到的大多数其他事情)

我想将你的问题分成三个要素:

  1. 图还是关系? (MySQL 与 Neo4J)
  2. 驱动程序/工程问题(Neo4jClient/REST 与 EF/MySQL)
  3. 建模实用性(“艰难地”实现社交图与 Neo4j 中的实现)

图表还是关系?

您应该阅读another answer I posted关于图数据库和图数据库查询性能的通用参数。我不会重述所有这些(因为它已经在 SO 上),但这里是执行摘要:图形数据库在需要遍历一堆边的路径关联查询方面非常好且快速。这些操作对应于关系世界中的事物,在关系世界中,您将一大堆表连接在一起,或者连接深度是可变的。在这些情况下,图表将比关系更好(性能方面)。如果您想对用户进行批量扫描或单个连接,那么您可能最好使用关系型(同样,请参阅其他答案以获取更多详细信息)。因此,根据这个标准,我推断您实际上只想一次遍历一条边 - 例如“向我显示鲍勃喜欢的所有内容”,并且您不需要进行更深层次的查询,例如“向我显示与鲍勃相距 3-4 度的每个人”。

驱动程序/工程问题

就速度而言,众所周知,java API 比 Neo4j 的 REST API 更快。 REST API 的性能是可变的,并且取决于许多其他因素,例如数据库是否托管在同一台计算机上,或者它的“网络距离”有多远。使用 REST 时,您总是会产生额外的开销,这些开销会伴随 HTTP 和序列化/反序列化 JSON 等内容,而如果您使用 java API,则不会有这些开销。因此,在所有其他条件相同的情况下(免责声明:它们从来都不是;)REST API 通常会比 EF 等慢。

建模实用性

在这里,neo4j 将会以很大优势获胜。使用 MySQL,您将拥有永远存在的 object-relational impedance mismatch ; neo4j 减少(但没有消除)这些阻抗不匹配问题。在建模方面,neo4j 是无模式的,这有很多优点和缺点。您可能可以使用 Neo4j 更快地拼凑出一个工作模型,因为您的领域从根本上来说是摄影领域的。

关于c# - 针对 C# 开发人员的 Neo4j 和 MSSQL 实用性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971208/

相关文章:

c# - Neo4jClient 节点 ID

c# - 使自动生成的部分类实现自定义接口(interface)

php - SQL-更改现有行

SQL 服务器 : Nesting Elements with FOR XML PATH

sql-server - 选择查询中使用的逗号分隔字段中的行数据

json - 无法在 Neo4j 3.2.6 上调用 apoc.load.json

database - Neo4j输出格式

c# - FileWatcher 典型实现?

c# - 将 async wait 与 AcquireTokenForClient().ExecuteAsync 一起使用的正确方法

c# - 如何检查我是否可以对给定类型的值求和