Sparql与XQuery(MarkLogic)

Sparql与XQuery(MarkLogic),sparql,xquery,marklogic,Sparql,Xquery,Marklogic,在使用MarkLogic之后,我意识到三元组的结果可以通过多种方式获得,例如完全使用Xquery或SPARQL。所以问题是,使用SPARQL比使用XQuery有什么优势吗?是否有一些索引使SPARQL比搜索某个语义查询快得多 例如,如果我们使用谓词/like检索所有语义文档 SPARQL SELECT * WHERE { ?s </like> ?o } 因此,这两者在效率上有什么区别吗?是的,肯定有区别。XQuery或SPARQL是否最有效完全取决于您试图解决的问题。XQuer

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

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

SPARQL

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

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

是的,肯定有区别。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中的进一步处理。有时还可以归结为数据的形状


是的,肯定有区别。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中的进一步处理。有时还可以归结为数据的形状


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

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