Rdf 需要特定类型的SPARQL查询帮助,请

Rdf 需要特定类型的SPARQL查询帮助,请,rdf,sparql,Rdf,Sparql,我有一个RDF三元组数据库,大致如下: 关键字002是doc0892中的关键字 关键字002短语“ThisisTest” 我有一个关键字列表,我想在一个查询中找到匹配项,例如,假设我有10个文档,我想知道(每个文档)文档中有哪些关键字“testing3”、“fubared”、“noob” 我可以构造什么样的SPARQL查询,这样我就可以输入并指定精确的单词列表(我尝试了正则表达式过滤器,但似乎不起作用。也给了我部分匹配项,但没有给我文档名称),然后返回包含文档的名称和匹配的关键字 我已经坚持了好

我有一个RDF三元组数据库,大致如下: 关键字002是doc0892中的关键字 关键字002短语“ThisisTest”

我有一个关键字列表,我想在一个查询中找到匹配项,例如,假设我有10个文档,我想知道(每个文档)文档中有哪些关键字“testing3”、“fubared”、“noob”

我可以构造什么样的SPARQL查询,这样我就可以输入并指定精确的单词列表(我尝试了正则表达式过滤器,但似乎不起作用。也给了我部分匹配项,但没有给我文档名称),然后返回包含文档的名称和匹配的关键字

我已经坚持了好几天,我让它工作,但它是通过一些递归循环,需要永远,我需要加快速度缓慢


**我的服务器关闭了,所以我现在无法访问我的triplestore,但谢谢你们的回复!如果我有任何问题,我会转发,非常感谢

通常,应该避免在SPARQL查询中使用正则表达式。SPARQL引擎通常不会很好地处理这个问题。那些确实提供特定功能对文本值进行正则表达式或关键字类型搜索的函数,通常基于特殊的Lucene索引。通常,regex最终会对任何相关的文本值执行大量regex,这可能非常昂贵

这将返回关键字为“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" .
  } 
  }
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}
}
如果要获取包含以下两个特定关键字之一的所有文档:

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" .
  } 
  }
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}
}

我想这会让你得到你想要的,你的领域本体的排版和准确的使用。一般来说,你应该避免在SPARQL查询中使用正则表达式。SPARQL引擎通常不会很好地处理这个问题。那些确实提供特定功能对文本值进行正则表达式或关键字类型搜索的函数,通常基于特殊的Lucene索引。通常,regex最终会对任何相关的文本值执行大量regex,这可能非常昂贵

这将返回关键字为“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" .
  } 
  }
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}
}
如果要获取包含以下两个特定关键字之一的所有文档:

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" .
  } 
  }
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}
}

我认为这会让你得到你想要的,你的领域本体的排版和准确使用,尽管没有经过测试,但有一种方法可能是:

select distinct ?keyword ?document
where {
  ?keyword ns:isKeywordIn ?document;
           ns:phrase ?phrase.
  FILTER regex( ?phrase, "^(testing3|n00b|fubared)$", "i" )
}
这将为您提供成对的文档和关键字,其中关键字匹配任何一种用户输入模式。请注意
^的用法$锚定,这样您只能获得完整的单词匹配,而不是部分匹配。但是,这可能会很慢,因为没有太多可供索引查询的独特信息,因此查询引擎必须测试语料库中的每个关键字

另一种方法是联合多个关键字的测试:

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" .
  } 
  }
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}
}
一个合理的查询优化器应该能够使用更具体的
:短语
三元组来索引查询。但是,构造查询稍微复杂一些。另一个缺点是,您没有与regex示例中的ignore case(
“i”
)标志相同的标志,因此用户输入必须与关键字文本完全匹配


最后一种选择是使用SPARQL扩展来利用三元组存储旁边的自由文本索引。例如,对于Jena,请参阅。

未经测试,但有一种方法类似于:

select distinct ?keyword ?document
where {
  ?keyword ns:isKeywordIn ?document;
           ns:phrase ?phrase.
  FILTER regex( ?phrase, "^(testing3|n00b|fubared)$", "i" )
}
这将为您提供成对的文档和关键字,其中关键字匹配任何一种用户输入模式。请注意
^的用法$锚定,这样您只能获得完整的单词匹配,而不是部分匹配。但是,这可能会很慢,因为没有太多可供索引查询的独特信息,因此查询引擎必须测试语料库中的每个关键字

另一种方法是联合多个关键字的测试:

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" .
  } 
  }
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}
}
一个合理的查询优化器应该能够使用更具体的
:短语
三元组来索引查询。但是,构造查询稍微复杂一些。另一个缺点是,您没有与regex示例中的ignore case(
“i”
)标志相同的标志,因此用户输入必须与关键字文本完全匹配


最后一种选择是使用SPARQL扩展来利用三元组存储旁边的自由文本索引。例如,对于Jena,请参见。

我建议,如果将来您要说您无法让其他查询工作,请提供您尝试但无法工作的查询。我建议将来如果您要说您无法让其他查询工作,我不同意你应该在SPARQL中避免使用正则表达式。这是一个非常有用的工具,与访问存储的成本相比,处理表达式匹配通常并不昂贵。通常更大的问题是查询优化器不能使用正则表达式的内容对查询进行索引,因此最好将正则表达式应用于过滤已经相当特定的查询。或者在小的三重存储中,迭代未索引查询的成本很低。公平地说,它的问题更多是因为大多数查询优化器除了尽可能晚地执行它之外,不能对它做任何聪明的事情。我认为使用带有非选择性查询的正则表达式并将数据库发送到杂草中通常是非常容易的,因此通常值得避免,尽管它可能很有用。我认为使用类似LARQ的东西是一个更好的选择。我不同意在SPARQL中应该避免使用正则表达式。这是一个非常有用的工具,与访问存储的成本相比,处理表达式匹配通常并不昂贵。通常是什么