Neo4J:二进制文件存储和文本搜索“堆栈”

时间:2015-12-29 10:45:56

标签: database neo4j

我有一个我想要工作的项目,我认为这是Neo4j的一个漂亮的案例。但是有一些关于实现这个问题的方面,我不太明白,我可以简洁地列出我的问题。相反,我会让场景说明一切:

场景:简单来说,我想构建一个应用程序,允许用户接收各种类型的文件,例如docs,excel,word,images,audio clip甚至视频 - 尽管不是如此多的视频,并允许他们上传和分类这些。

每个文件都会输入任何和所有关联。示例:

  • 如果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中的上传文件。

    对于将所有文件都放在DB中并不那么自信。感觉更舒适,可以在文件夹中访问我的所有文件。

    每个人都说将文件放入数据库非常棒。每个人都说将文件放在数据库中并不好。

找到血腥的问题..

  1. 有人能建议一个适合上述情况的好“堆叠”吗?
  2. 请详细说明如何实施您的建议,即:

    • 让应用程序将数据存储到Neo4J中,然后使用触发器更新Postgres。
    • 或者将文件加载到Postgres并触发更新Neo4J。
    • 或让应用程序将数据加载到Nea4J,然后应用程序将数据加载到Postgres。
  3. 如何将这些联系在一起可能是我真正想要掌握的。

    非常感谢您对此的任何意见。

    干杯。

    P.S。真是漫无边际!如果您觉得需要编辑我的问题或标题以简化,那就去吧! :)

1 个答案:

答案 0 :(得分:0)

以下是我的建议:

  • 永远不要将二进制文件存储在数据库中。存储在文件系统或AWS S3之类的服务中,并引用数据模型中的文件。
  • 我会先将文件存储在S3中,然后在主数据库中对它进行引用(Neo4j?)
  • 如果您希望能够搜索文档中的任何字词,我建议您使用Elastic Search等全文搜索引擎。弹性搜索可以使用Tika扫描多种文档格式,如PDF。
  • 您也可以使用Elastic / Tika搜索文档中的关系并对其进行表面处理以更新图表。

建议堆栈:

  • Neo4j的
  • ElasticSearch
  • AWS S3或其他一些冗余文件系统,以避免数据丢失

奖励:有关使用ES以多种格式索引文件的最佳做法,请参阅this SO question/answer