【问题标题】:Sparql VS XQuery (MarkLogic)Sparql VS XQuery (MarkLogic)
【发布时间】:2019-03-11 06:02:37
【问题描述】:

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

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

SPARQL

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

XQuery

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

那么,这两者的效率有区别吗?

【问题讨论】:

    标签: sparql xquery marklogic


    【解决方案1】:

    是的,肯定存在差异。 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!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多