我目前正在尝试从XQuery控制台查看是否可以在SPARQL中使用同义词库。我当前使用的代码如下所示
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy";
import module namespace thsr="http://marklogic.com/xdmp/thesaurus"
at "/MarkLogic/thesaurus.xqy";
sem:sparql(
'
PREFIX xs: <http://www.w3.org/2001/XMLSchema#>
PREFIX cts: <http://marklogic.com/cts#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema/>
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX db: <http://dbpedia.org/resource/>
PREFIX onto: <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns>
PREFIX xdmp: <http://marklogic.com/xdmp#>
SELECT *
WHERE{
?question </has_comment> ?comment .
?commented_by_person </commented_by> ?comment .
#FILTER (cts:contains(fn:doc(?comment), thsr:expand( cts:element-word-query(xs:QName("text"),"go"), thsr:lookup("/myThsrDocs/wordnet.xml", "go"), (), (), () ) ) ) .
}',
(),
(),
() #thsr:expand( cts:element-word-query(xs:QName("text"),"go"), thsr:lookup("/myThsrDocs/wordnet.xml", "go"), (), (), () )
)
在上面显示的代码中,有两个位置,带有注释,显示了我认为可以放置它们的位置。但是,如果在SPARQL查询之前使用thsr:expand
,它将删除所有sem:triple
文档,从而导致查询为空。另一方面,如果将其放在SPARQL查询中,则会导致错误,因为未提供thsr
的前缀,因为我似乎无法在SPARQL中找到thsr
的前缀。
因此,将不胜感激任何建议或方法。
===更新===
目前,我设法根据此thread提出了解决方案。在返回结果之前,使用FLOWER Expression进行迭代并检查是否满足特定条件。可以在下面看到实现此目的的代码。
for $d in $test
return (
for $x in $d
where(cts:contains($x["comment_text"],thsr:expand(cts:word-query("go"), thsr:lookup("/myThsrDocs/wordnet.xml", "go"),(), (), () ))) or ($x["comment_text"] = "comment_text")
return $x
)
但是,正如所看到的那样,它的扩展性似乎并不高。因此,对于此解决方案的任何改进或其他实现此方法的方法,将不胜感激。