Sparql VS XQuery(MarkLogic)

Sparql VS XQuery (MarkLogic)

在使用 MarkLogic 之后,我意识到可以通过多种方式获得三元组的结果,例如完全使用 Xquery 或 SPARQL。所以问题是,使用 SPARQL 比 XQuery 有什么优势吗?是否有一些正在进行的索引使 SPARQL 比搜索特定语义查询快得多?

例如,如果我们使用谓词“/like”检索所有语义文档。

SPARQL

SELECT *
WHERE {
  ?s </like> ?o
}

XQuery

cts:search(fn:doc(), cts:element-query(xs:QName("sem:predicate"), "/like"))

那么,这两者在效率上有什么区别吗?

是的,肯定有区别。 XQuery 或 SPARQL 是最有效的还是完全取决于您要解决的问题。 XQuery 最擅长查询和处理文档数据,而 SPARQL 确实可以让您轻松地对 RDF 数据进行推理。

确实RDF数据在MarkLogic中被序列化为XML,可以全文搜索,如果喜欢还可以加范围索引,但是RDF数据在三重索引,比上面的全文搜索更准确。

另请注意,SPARQL 允许您遵循谓词路径,这涉及大量连接。如果通过 SPARQL 完成,这将比通过 XQuery 更有效,因为它主要通过三重索引解析。想象一个像这样的 SPARQL 查询:

PREFIX pers: <http://my.persons/>;
PREFIX topic: <http://my.topics/>;
PREFIX pred: <http://my.predicates/>;
SELECT DISTINCT *
WHERE {
  ?person pred:likes topic:Chocolate;
          pred:friendOf+ ?friend.
  FILTER( ?friend = (pres:WhiteSolstice) )
  FILTER( ?friend != ?person )
}

它试图找到所有喜欢巧克力的直接和间接朋友。我不会在 XQuery 中写这样的东西。

话又说回来,还有一些其他事情在 XQuery 中很容易,而在 SPARQL 中几乎不可能。有时最有效的方法是将两者结合起来,从 XQuery 内部执行 sem:sparql,然后使用结果指导 XQuery 中的进一步处理。有时还取决于您的数据的形状..

HTH!

这里有一点细微差别:搜索是关于搜索文档。除非每个文档有一个三元组,否则仅从文档中的一堆中获取匹配的三元组将涉及从磁盘中提取整个文档(尽管它可能在缓存中)。 SPARQL 是从三元组索引中选择三元组数据,这可能涉及较少的磁盘 IO。当然,如果您要做的不是简单地获取简单的三重模式,那么您将需要了解 SPARQL 为您提供的关系。