1

我有一个在 ModeShape (4.0.0.Final) 中实现的 JCR 内容存储库。存储库的结构非常简单,如下所示:

/ (root)
    Content/
        Item 1
        Item 2
        Item 3
        ...

    Tags/
        Foo/
        Bar/
        .../

内容最初被创建并存储/Content为带有mixin的[nt:unstructured]节点。[mix:shareable]标记内容项时,如果标记节点/Tags尚不存在,则首先在其下创建标记节点,然后使用JCR 2.0 规范第 14.1 节,共享节点创建中Workspace.clone(...)所述将内容节点共享/克隆到标记节点。

(我觉得这不是特别优雅,我刚刚阅读了这个答案,关于在 JCR 中创建基于标签的搜索系统,所以我意识到这可能不是最好/最快/最具可扩展性的解决方案。但我“继承”了这个解决方案来自我之前的开发人员,所以我希望我不必全部重写......)

无论如何,共享本身似乎有效(我可以使用 ModeShape Content Explorer Web 应用程序或以编程方式验证节点是否存在session.getRootNode().getNode("Tags/Foo").getNodes())。但我无法使用查询找到任何共享节点!

我最初的尝试(使用JCR_SQL2语法)是:

SELECT * FROM [nt:unstructured] AS content
    WHERE PATH(content) LIKE '/Tags/Foo/%' // ISDECENDANTNODE(content, '/Tags/Foo') gives same result
    ORDER BY NAME(content)

结果集令我惊讶的是空的。

我也试过[mix:shareable]这样搜索:

SELECT * FROM [mix:shareable] AS content
    WHERE PATH(content) LIKE '/Tags/Foo/%' // ISDECENDANTNODE(content, '/Tags/Foo') gives same result
    ORDER BY NAME(content)

这也返回了一个空的结果集。

我可以从查询中看到:

SELECT * FROM [nt:unstructured] AS content
    WHERE PATH(content) LIKE '/Content/%' // ISDECENDANTNODE(content, '/Content') works just as well
    ORDER BY NAME(content)

...否则查询可以正常工作,并返回预期结果(所有内容)。它只是在搜索共享节点时不起作用。

如何使用 ModeShape 在 JCR 中正确搜索共享节点?

更新:我升级到 4.1.0.Final 看看是否有帮助,但它对所描述的行为没有影响。

4

1 回答 1

2

来自ModeShape 论坛的交叉发布:

共享节点实际上只是一个出现在工作空间内多个位置的单个节点,因此尚不清楚为该一个可共享节点获取多个查询结果的语义含义。根据JSR-283 (JCR 2.0) 规范的第 14.16 节,实现可以自由地将可共享节点包含在查询结果中的一个或多个/所有这些位置。

ModeShape 2.x 和 3.x 总是在查询结果中只返回一个共享节点的位置,因为这是参考实现的行为,也是我们从用户那里得到的反馈。当我们在开发 Modeshape 4.0 时,我们试图让返回多个结果成为可能,但我们遇到了 TCK 的问题,并且不确定这种新的预期行为会是什么。因此,我们放弃了我们的目标并实施查询以仅返回一个共享位置,就像我们对 2.x 和 3.x 所做的那样。

我可能错了,但我不确定是否有任何JCR 实现为单个共享节点返回多行,但我可能错了。

于 2015-02-13T14:35:35.673 回答