我将非托管三元组存储为我存储在内容数据库中的单个文档的一部分.基本上每个文档代表一个人,定义的三元组指定了该人的经理的文档URI.我正在尝试使用SPARQL来确定管理器与层次结构中它们下面的所有人之间的路径长度.
文档中的三元组看起来像
<sem:triple xmlns:sem="http://marklogic.com/semantics">
<sem:subject>http://rdf.abbvienet.com/infrastructure/person/10740024</sem:subject>
<sem:predicate>http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager</sem:predicate>
<sem:object>http://rdf.abbvienet.com/infrastructure/person/10206242</sem:object>
</sem:triple>
Run Code Online (Sandbox Code Playgroud)
我找到了以下sparql查询,该查询可用于返回管理器,层次结构中位于它们下方的人员以及它们所在的节点数量.
select ?manager ?leaf (count(?mid) as ?distance) {
BIND(<http://rdf.abbvienet.com/infrastructure/person/10025613> as ?manager)
?leaf <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>* ?mid .
?mid <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>+ ?manager .
}
group by ?manager ?leaf
order by ?manager ?leaf
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是非常慢,即使我正在查看的层次结构树是一个或两个深度,大约15s.我在db中有63,139个这种类型的管理器三元组.
我正在调用sec:role-exists().我试图找出将此功能授予管理员以外的其他人所需的权限.我得到的错误意味着我需要http://marklogic.com/xdmp/privileges/get-role权限.
SEC-PRIVDNE: xdmp:security-assert("http://marklogic.com/xdmp/privileges/get-role", "execute") -- Privilege does not exist: action(http://marklogic.com/xdmp/privileges/get-role), kind(execute)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试通过sec:privilege-add-roles使用admin帐户授予此角色时,它告诉我该权限不存在.
[1.0-ml] SEC-PRIVDNE: (err:FOER0000) Privilege does not exist: action(http://marklogic.com/xdmp/privileges/get-role), kind(execute)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是我用来授权的代码片段,我以管理员身份运行.
(: grant the needed privileges to the role :)
let $grant_privs :=
xdmp:invoke-function(
function() {
let $required_roles := (
"http://marklogic.com/xdmp/privileges/create-role",
"http://marklogic.com/xdmp/privileges/remove-role",
"http://marklogic.com/xdmp/privileges/get-role-ids",
"http://marklogic.com/xdmp/privileges/get-role-names",
"http://marklogic.com/xdmp/privileges/get-role",
"http://marklogic.com/xdmp/privileges/xdmp-invoke-in",
"http://marklogic.com/xdmp/privileges/xdmp-invoke"
)
return
for $r in $required_roles
return
sec:privilege-add-roles(
$r,
"execute",
"auth-lib"
)
},
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>
)
Run Code Online (Sandbox Code Playgroud) 有什么方法可以创建自定义约束,使正确的部分可以包含复杂的逻辑?即
name:(phil OR tom)
Run Code Online (Sandbox Code Playgroud)
在我的函数中,当我获得$ right面时,整个值都简化为所有文本的简单串联字符串,即
<cts:word-query xmlns:cts="http://marklogic.com/cts">
<cts:text>phil tom</cts:text>
</cts:word-query>
Run Code Online (Sandbox Code Playgroud)
我想要做的是获取一个已解析的查询,然后将自己的添加内容添加到已解析的查询中。所以我希望有某种方法可以使$ right参数成为类似
<cts:or-query xmlns:cts="http://marklogic.com/cts">
<cts:word-query>
<cts:text>phil</cts:text>
</cts:word-query>
<cts:word-query>
<cts:text>tom</cts:text>
</cts:word-query>
</cts:or-query>
Run Code Online (Sandbox Code Playgroud)
我想获取查询的输出结果,并使用另一个查询进行扩展以获取实际结果。即我有一个name限制,将搜索限制在各种名称字段中。找到匹配的人之后,我想将结果从匹配的人转变为一个人的层次结构,也许向下两层。作为转换结果或自定义约束,这似乎没有意义。这仅仅是一个自定义的REST端点吗?我希望利用已经内置在标准搜索端点中的分页。
从查询控制台执行测试代码时,是否还要导入位于模块db中的XQuery模块?我假设QueryConsole被设置为仅从文件系统加载模块,这就是为什么当我尝试加载我的时,我得到的模块没有找到.
我正在寻找一种简单的方法来测试我编写的XQuery代码,而我现在正在做的是简单地将整个代码与多个模块中的所有函数粘贴到同一个查询选项卡中以便进行测试.
有没有人对他们如何为MarkLogic测试他们的xquery模块有任何建议?
更新
我尝试了下面的建议,指定内容db而不是模块db.但我仍然没有成功.
而我得到的错误是:
XDMP-MODNOTFOUND: (err:XQST0059) Module /AbbVie/authorization/lib/authorization.xqy not found
Run Code Online (Sandbox Code Playgroud)
解决
在尝试遵循建议时,我将库文件加载到不正确的路径中.
我正在寻找一种方法,在执行时只对特定元素进行通配符搜索search:search.具体来说,我可能有类似以下的文档:
<pdbe:person-envelope xmlns:pdbe="http://schemas.abbvienet.com/people-db/envelope">
<person xmlns="http://schemas.abbvienet.com/people-db/model">
<costcenter>
<code>0000601775</code>
<name>DISC-PLAT INFORM</name>
</costcenter>
<displayName>Tj Tang</displayName>
<upi>10025613</upi>
<firstName>
<preferred>TJ</preferred>
<given>Tze-John</given>
</firstName>
<lastName>
<preferred>Tang</preferred>
<given>Tang</given>
</lastName>
<title>Principal Research Scientist</title>
</person>
<pdbe:raw/>
</pdbe:person-envelope>
Run Code Online (Sandbox Code Playgroud)
当搜索发生时,我希望搜索文本自动通配,但仅适用于某些元素,如displayName,firstName,lastName,但不适用于upi或代码.据我所知,我会在数据库中启用某些通配符相关的索引,但是我需要有一个自定义查询解析器,将查询重写为我想要通配符搜索的每个元素的多个cts:element-query和cts:element-value-query语句,或者使用最初解析的搜索查询.或者我可以创建字段约束,并重写查询以使用字段约束.
当用户输入简单的搜索查询时,是否有另一种方法可以在某些元素上使用通配符进行条件搜索,而不是其他元素,即部分名字和姓氏"TJ Tan",但是当我搜索"100256"时没有部分命中.
我使用的是ansible 2.1.0.当我尝试使用ec2_vol创建一个新卷时,我得到的错误是'Volume'对象没有属性'encrypted'.跟踪是:
An exception occurred during task execution. The full traceback is:
Traceback (most recent call last):
File "/tmp/ansible_QgknUu/ansible_module_ec2_vol.py", line 593, in <module>
main()
File "/tmp/ansible_QgknUu/ansible_module_ec2_vol.py", line 583, in main
volume_info = get_volume_info(volume, state)
File "/tmp/ansible_QgknUu/ansible_module_ec2_vol.py", line 454, in get_volume_info
'encrypted': volume.encrypted,
AttributeError: 'Volume' object has no attribute 'encrypted'
Run Code Online (Sandbox Code Playgroud)
有没有人见过这个?
我正在使用xdmp:invoke调用在安全数据库中创建一个新角色.作为调用调用的选项,我指定了以下选项:
<options xmlns="xdmp:eval">
<database>{ xdmp:security-database() }</database>
<transaction-mode>update</transaction-mode>
<isolation>different-transaction</isolation>
<prevent-deadlocks>false</prevent-deadlocks>
</options>
Run Code Online (Sandbox Code Playgroud)
我的想法是,这将在一个单独的事务中执行,然后我将能够访问此调用后代码中的更改.但是当我使用我刚刚创建的角色的名称为xdmp:permission()创建一个all时,我得到一个Role Does Not Exist错误.
无论如何要解决这个问题?
更新
以下代码段有效.所以我会解决更多问题,看看我的更复杂的代码中是否还有其他问题.
xquery version "1.0-ml";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
let $create_role :=
xdmp:invoke-function(
function() {
sec:create-role(
'sec_test',
'Security Test Role',
(),
(),
()
)
},
<options xmlns="xdmp:eval">
<database>{xdmp:security-database()}</database>
<transaction-mode>update-auto-commit</transaction-mode>
<isolation>different-transaction</isolation>
</options>
)
return xdmp:permission('sec_test', 'read')
Run Code Online (Sandbox Code Playgroud)
第二次更新
似乎如果我调用的函数执行create-role是在另一个xqy文件中,那么它将失败并找不到角色错误.例如,我在security-util.xqy中有以下模块.
xquery version "1.0-ml";
module namespace asu = "http://ir.abbvie.com/marklogic/authorization/lib/security-util";
import module namespace sec = "http://marklogic.com/xdmp/security"
at "/MarkLogic/security.xqy";
declare option xdmp:mapping "false";
declare function asu:create-role-2(
$role_name …Run Code Online (Sandbox Code Playgroud) 是否存在类似于xdmp:directory的目录,用于遍历具有不以"/"开头的uris的文档,即" http://something.other.com/documents/ "?或者是否有某种方法可以获取文档uri与正则表达式匹配的所有文档?
例如,我想拉文件: