我有一个在 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 看看是否有帮助,但它对所描述的行为没有影响。