我开发了一个工具,可以搜索我创作的本体。它将搜索提交为SPARQL查询。
我收到一些反馈,我的搜索实现是全有或全无,或者#34;二进制"。换句话说,如果用户的输入与本体中的术语完全匹配,则他们根本不会获得任何命中。
我被要求添加一些更灵活的,或者#34;高级"搜索算法。建议索引和词袋搜索。
有人能举例说明在不需要字面匹配的本体上实现搜索方法吗?
答案 0 :(得分:0)
首先,您尝试匹配哪种实体(文字或URI的字符串转换?),以及您现在运行的是哪种SPARQL查询?像这样的东西?
?term ?predicate "user input" .
如果您 搜索文字,您可以通过使用不区分大小写的正则表达式过滤使搜索更加灵活,尽管这可能会使您的搜索速度变慢,并且赢得了# 39; t抓住一些单词标记存在但顺序不同的情况。在下面的示例中,您应该首先限制?term
和?predicate
的类型,甚至可以过滤字符串数据类型?userInput
?term ?predicate ?someLiteral .
FILTER(regex(?someLiteral), "user input", "i"))
多个三重商店支持全文搜索和结果评分。这些通常是SPARQL语言的扩展。
例如, Virtuoso 和其他一些提供bif:contains
谓词。 Virtuoso还提供faceted search web interface(我认为还有一项服务。)我对 Blazegraph 和 Stardog 中基于网络的全文搜索感到满意,但是到目前为止,我无法就SPARQL查询使用它们来获取搜索模式的分数。有些( GraphDB )甚至支持与Lucene或Solr *的显式集成,因此您可以利用他们的搜索语言。
最后......您使用的是像 OWL API 或 RDF4J 这样的库来访问您的本体吗?如果是这样,您当然可以保存您的术语与Java本机数据结构中的任何文字之间的关系,然后直接使用像Lucene这样的模糊搜索组件将每个文字索引为"文档"然后在索引中搜索用户输入。
为什么不发布您的本体,并举例说明您希望以非二进制方式执行搜索。我(或其他人)可以尝试向您展示最小的实现。
* Solr集成似乎仅在GraphDB的商业许可版本中提供