一尘不染

将元数据存储到Jackrabbit存储库中

java

有人可以告诉我,在以下情况下如何进行?

  1. 接收文件(MS文件,ODS,PDF)

  2. 通过Apache Tika提取公元核心元数据+通过jackrabbit-content-extractors提取内容

  3. 使用Jackrabbit将文档(内容)及其元数据存储到存储库中

  4. 检索文档+元数据

我对第3点和第4点感兴趣…

详细信息:该应用程序正在以交互方式处理文档(一些分析-语言检测,单词计数等。+收集尽可能多的详细信息-
Dublin核心+解析内容/事件处理),以便将处理结果返回给用户,然后将其返回给用户。提取的内容和元数据(提取的和自定义的用户元数据)存储到JCR存储库中

感谢任何帮助,谢谢


阅读 333

收藏
2020-12-03

共1个答案

一尘不染

对于JCR 2.0,上传文件基本上与对于JCR 1.0而言是相同的。但是,JCR 2.0添加了一些有用的附加内置属性定义。

“ nt:file”节点类型旨在表示文件,并且在JCR 2.0中具有两个内置属性定义(这两个属性定义都是在创建节点时由存储库自动创建的):

  • jcr:已创建(DATE)
  • jcr:createdBy(STRING)

并定义一个名为“ jcr:content”的子级。该“
jcr:content”节点可以是任何节点类型,但是通常来说,与内容本身有关的所有信息都存储在此子节点上。事实上的标准是使用“
nt:resource”节点类型,该节点类型定义了以下属性:

  • jcr:data(BINARY)必选
  • jcr:lastModified(DATE)自动创建
  • jcr:lastModifiedBy(STRING)自动创建
  • jcr:mimeType(STRING)受保护吗?
  • jcr:encoding(STRING)受保护吗?

注意,在JCR 2.0中添加了“ jcr:mimeType”和“ jcr:encoding”。

特别是,“ jcr:mimeType”属性的目的是完全按照您的要求执行-捕获内容的“类型”。但是,“ jcr:mimeType”和“
jcr:encoding”属性定义可以(通过JCR实现)定义为受保护(意味着JCR实现自动设置它们)-如果是这种情况,将不允许您手动进行设置这些属性。我相信JackrabbitModeShape不会将它们视为受保护的对象。

以下是一些代码,显示了如何使用这些内置节点类型将文件上传到JCR 2.0存储库:

// Get an input stream for the file ...
File file = ...
InputStream stream = new BufferedInputStream(new FileInputStream(file));

Node folder = session.getNode("/absolute/path/to/folder/node");
Node file = folder.addNode("Article.pdf","nt:file");
Node content = file.addNode("jcr:content","nt:resource");
Binary binary = session.getValueFactory().createBinary(stream);
content.setProperty("jcr:data",binary);

而且,如果JCR实现未将“ jcr:mimeType”属性视为受保护的对象(即Jackrabbit和ModeShape),则必须手动设置此属性:

content.setProperty("jcr:mimeType","application/pdf");

元数据可以很容易地存储在“ nt:file”和“ jcr:content”节点上,但是现成的“ nt:file”和“
nt:resource”节点类型不允许额外的属性。因此,在添加其他属性之前,首先需要添加一个mixin(或多个mixin),这些mixin具有要存储的各种属性的属性定义。您甚至可以定义允许任何属性的混合。这是一个定义此类混合的CND文件:

<custom = 'http://example.com/mydomain'>
[custom:extensible] mixin
- * (undefined) multiple 
- * (undefined)

注册此节点类型定义后,可以在节点上使用它:

content.addMixin("custom:extensible");
content.setProperty("anyProp","some value");
content.setProperty("custom:otherProp","some other value");

您还可以定义并使用允许所有Dublin Core元素使用的mixin :

<dc = 'http://purl.org/dc/elements/1.1/'>
[dc:metadata] mixin
- dc:contributor (STRING)
- dc:coverage (STRING)
- dc:creator (STRING)
- dc:date (DATE)
- dc:description (STRING)
- dc:format (STRING)
- dc:identifier (STRING)
- dc:language (STRING)
- dc:publisher (STRING)
- dc:relation (STRING)
- dc:right (STRING)
- dc:source (STRING)
- dc:subject (STRING)
- dc:title (STRING)
- dc:type (STRING)

所有这些属性都是可选的,并且该mixin不允许使用任何名称或类型的属性。我还没有真正解决“
dc:metadata”混合问题,因为其中一些已经用内置属性表示(例如,“ jcr:createBy”,“ jcr:lastModifiedBy”,“
jcr:created” ,“ jcr:lastModified”,“ jcr:mimeType”),其中一些可能与内容更相关,而其他一些与文件更相关。

您当然可以定义其他更适合您的元数据需求的混合,并在需要时使用继承。但是要谨慎使用继承与mixin-
由于JCR允许一个节点使用多个mixin,因此通常最好将mixin设计为范围狭窄且面向方面的(例如,“ ex:taggable”,“
ex:describable”等)。然后只需根据需要将适当的mixin应用于节点。

(甚至更复杂,甚至有可能定义一个混合,以便在“ nt:file”节点下允许更多子节点,并在其中存储一些元数据。)

Mixins非常棒,为您的JCR内容提供了极大的灵活性和力量。

哦,当您创建了所有想要的节点后,请确保保存会话:

session.save();
2020-12-03