【发布时间】:2018-08-07 11:28:51
【问题描述】:
是否可以使用cts 查询对三元组执行通配符搜索?
我已经在sparql 中尝试过,我得到了正确的结果,但是查询很慢。
例如:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select ?iri
where {
?iri skos:prefLabel ?prefLabel .
filter (STRSTARTS(lcase(?prefLabel), 'soviet'))
} limit 250
上面的查询返回了正确的结果,但是查询非常慢。
因为我正在构建一个自动建议 API,它应该非常快。
请帮忙。
戴夫评论后更新:
我尝试了第二种方法,它比前一种方法好,但速度没有那么快。
cts filtered 查询运行有点慢,我们无法在当前 xml 结构上进行 unfiltered 搜索。
在项目中,我们需要非常快速的建议,因此我尝试了以下方法。
我为每个主题创建了如下所述的 XML 文件
<record>
<pref-label>Dixit Singla</pref-label>
<iri>prefix:12345</iri>
</record>
现在使用cts:element-values on iri element 并使用wildcarded cts:element-value-query on pref-label 过滤它,我得到所有匹配的虹膜并将它们传递给sparql 查询。通过这个,我可以看到很大的性能提升。
cts:element-values(xs:QName('iri'), (),(), cts:element-value-query(xs:QName('pref-label'), 'sov* *'))
我知道上述方法会消耗更多内存,但这很好,因为性能非常好:)
观察:当主题通过sparql 时,它运行得非常快。
喜欢:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select ?iri
where {
values ?iri {prefix:12345 prefix:12346 prefix:12339 prefix:12345}
?iri skos:prefLabel ?prefLabel .
#apply filters
} limit 250
【问题讨论】:
-
如果没有全文索引,您在 SPARQL 中大多会丢失,因为必须对中间结果进行全扫描 + 过滤。 Marklogic 是否支持全文搜索功能?如果是这样,请使用它
-
好的,
cts:contains在 SPARQL 中原生工作。您可以尝试cts:search是否也可以,然后使用XQuery 表达式。我这里没有 Marklogic 服务器 -
XPath 通过
fn:前缀也是可以的,但是如果这里没有使用全文索引,那么检查字符串开始仍然会很昂贵 -
您使用的是托管三元组还是嵌入式三元组?
-
托管三元组。