我将非托管三元组存储为我存储在内容数据库中的单个文档的一部分。基本上每个文档代表一个人,并且定义的三元组指定了该人的经理的文档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>
我找到了以下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
这很有效,但是非常慢,即使在我正在查看的层次结构树是一层或两层深度, 15s 的情况下。我在db中有 63,139 这种类型的经理三元组。
答案 0 :(得分:6)
我认为最大的问题是BIND()
- MarkLogic 8并没有优化您正在使用的模式。您可以尝试将常量替换为使用?manager
变量的位置,看看这是否会产生很大的影响?即:
select ?leaf (count(?mid) as ?distance) {
?leaf <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>* ?mid .
?mid <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>+
<http://rdf.abbvienet.com/infrastructure/person/10025613> .
}
group by ?leaf
order by ?leaf
StackOverflow不是回答这样的性能问题的好地方,因为它真的需要我们一起工作来帮助您的对话。也许您可以尝试联系support或MarkLogic developer mailing list来解决此类问题?