我有一个RDF三元组的数据库,它们是: keyword002 isKeywordIn doc0892 keyword002短语“thisIsATest”
我有一个关键字列表,我想在一个查询中找到匹配项,例如,假设我有10个文档,我想知道(对于每个文档)哪些关键字“testing3” “,”fubared“,”noob“在文件中。
我可以构造什么SPARQL查询,以便我可以指定一个确切的单词列表(我尝试一个正则表达式过滤器,但似乎没有工作。也给了我部分匹配,并没有给我文档名称)和获取包含文档的名称和匹配的关键字?
我已经被困在这几天了,我得到它的工作,但它是通过一些递归循环,并需要永远,我需要急剧加快速度。
* *我的服务器已关闭,所以我现在无法访问我的三元组,但是谢谢你们的回复!如果我有任何问题我将重新发布,非常感谢你!
答案 0 :(得分:3)
未经测试,但有一种方法可能是:
select distinct ?keyword ?document
where {
?keyword ns:isKeywordIn ?document;
ns:phrase ?phrase.
FILTER regex( ?phrase, "^(testing3|n00b|fubared)$", "i" )
}
这将为您提供文档和关键字对,其中关键字与任何一个用户输入模式匹配。请注意^ ... $
锚点的使用,以便您只获得完整的单词匹配,而不是部分匹配。但是,这可能会很慢,因为没有太多独特的信息来索引查询,因此查询引擎必须测试语料库中的每个关键字。
另一种方法是将多个关键字的测试结合起来:
select distinct ?keyword ?document
where {
{?keyword ns:phrase "testing3" ; ns:isKeywordIn ?document}
union
{?keyword ns:phrase "n00b" ; ns:isKeywordIn ?document}
union
{?keyword ns:phrase "fubared" ; ns:isKeywordIn ?document}
}
合理的查询优化器应该能够使用更具体的:phrase
三元组来索引查询。但是,构造查询稍微复杂一些。另一个缺点是,您没有相应的regex示例中的ignore-case("i"
)标志,因此您的用户输入必须与您的关键字文本完全匹配。
最后一种方法是使用SPARQL扩展来在三元组商店旁边利用自由文本索引。例如。对于耶拿,请参阅LARQ。
答案 1 :(得分:2)
通常,您应该避免在SPARQL查询中使用正则表达式。 SPARQL引擎通常不是为处理这个问题而设计的。通过基于特殊的Lucene索引,确实提供用于执行正则表达式或关键字类型搜索的特定功能的文字值。通常,正则表达式最终会在任何相关的Literal值上执行大量的正则表达式,这可能非常昂贵。
这应该返回带有关键字“testing3”
的文档select ?doc ?name where {
?doc :name ?name .
?keyword :isKeywordIn ?doc .
?keyword :phrase "testing3" .
}
如果您想获取包含两个特定关键字的所有文档:
select ?doc ?name where {
?doc :name ?name .
?keyword :isKeywordIn ?doc .
?keyword :phrase "testing3" .
?kw :isKeywordIn ?doc .
?kw :phrase "noob" .
}
如果您想获得两个特定关键字中的任何一个的所有文档:
select distinct ?doc ?name where {
?doc :name ?name .
{
?keyword :isKeywordIn ?doc .
?keyword :phrase "testing3" .
} union {
?kw :isKeywordIn ?doc .
?kw :phrase "noob" .
}
}
我认为这会让你想要你正在寻找,错字和确切使用你的域本体不能承受。