我有一个项目想做,我觉得这是Neo4j的一个很好的案例。但是,关于实现这一点,我对某些方面的理解不够,无法简明扼要地列出我的问题。因此,我将让这个场景不言自明:
场景:简单地说,我想构建一个应用程序,允许用户接收各种类型的文件,如文档、excel、word、图像、音频片段甚至视频,尽管不是很多视频,并允许他们上传和分类这些文件。
对于每个文件,他们将进入任何和所有的关联。示例:
- 如果Joe编写了PDF,则Joe与该PDF关联
- 如果DOC说Sally是Mary的母亲,则Sally与Mary有关联
- 如果Bill向Jane发送了电子邮件,则Bill与Jane(以及电子邮件)关联
- 如果X公司向Y公司发送发票(Excel网格),则X与Y关联
等等…
因此,目前的基本目标是:
- 让用户在收到文件时加载文件
- 输入每个文件包含的关联
- 全面回顾关联,以便预测或采取一些行动
- 生成感兴趣的关联的报告,包括关联所基于的文件
这个项目的价值在于关联,事实上,关联会比上面的例子复杂得多,应该会产生有趣的结论。然而如果用户被问到"你是如何得出这个结论的",他们需要能够生成关联的摘要以及这些关联所基于的任何文件,即PDF或EXCEL或其他文件。
最初的想法
我还应该补充一点,这个应用程序将在内部托管,可能有大约50名用户使用,所以我可能不需要超级重复、最快、可扩展、高可用性的解决方案。不过,加载的数据可能会变得相当大,一年内可能高达1TB?(不是关联,而是实际文件)
如果Neo4J能做到这一切,那岂不是太好了!显然,它应该能很好地处理这方面的图形,但我认为文件存储和文本搜索需要添加另一个播放器。
我所知道的一些解决方案组合是:
-
将包括文件在内的所有内容存储为Neo4J中的二进制文件
会为Neo4J的一些不适合它的东西而摔跤。如何搜索文本?
-
仅在Neo4J中存储关联和元数据,并在文件系统中上传文件
如何对存储在文件服务器上的文件进行文本搜索?
-
只在Neo4J中存储关联和元数据,并在Postgres中上传文件
对数据库中包含我的所有文件不太有信心。在文件夹中访问我的所有文件会让我感觉更舒服。
每个人都说把你的文件放在数据库里很好。每个人都说把你的文件放在数据库里不太好。
进入血腥的问题
- 有人能提出一个适合上述情况的好"堆栈"吗
-
请大致介绍一下你将如何实施你的建议,即:
- 让应用程序将数据存储到Neo4J中,然后使用触发器更新Postgres
- 或者将文件加载到Postgres中并触发更新Neo4J
- 或者让应用程序将数据加载到Nea4J,然后将数据加载至Postgres
- 等等
你会如何把这些联系在一起,这可能是我真正想掌握的。
非常感谢您对此提供的意见。
干杯。
多么无聊的漫步!如果你觉得有必要编辑我的问题或标题以简化,那就去做吧!:)
以下是我的建议:
- 永远不要在数据库中存储二进制文件。存储在文件系统或类似AWS S3的服务中,并在数据模型中引用该文件
- 我会先将文件存储在S3中,并在您的主数据库(Neo4j?)中引用它
- 如果你想在文档中搜索任何单词,我建议你使用像Elastic search这样的全文搜索引擎。Elastic Search可以使用Tika扫描多种文档格式,如PDF
- 您可能还可以使用Elastic/Tika来搜索文档中的关系,并将它们显示出来以更新图形
建议堆叠:
- Neo4j
- ElasticSearch
- AWS S3或其他一些冗余文件系统,以避免数据丢失
额外奖励:请参阅此SO问答,了解使用ES.