【问题标题】:Order of Predicates not retained with Apache Jena RDFApache Jena RDF 未保留的谓词顺序
【发布时间】:2016-04-11 10:37:23
【问题描述】:

当我尝试使用 Apache Jena API 重新启动超过 9 个属性对象时,我添加的方式不会保留排序。谁能解释一下原因以及我该如何解决?

【问题讨论】:

  • 您能具体描述一下您的意思吗?也许举个例子? RDF 图是一个 set 三元组,它们没有顺序。同一个图可以用多种方式编写,甚至用 RDF/XML。有关这方面的一些示例,请参阅 this answer
  • 您需要澄清这个问题(正如@JoshuaTaylor 所说)。你到底在做什么,预期的结果是什么,你实际得到了什么。包含代码。
  • RDF 中的顺序丢失并不奇怪,因为 RDF 图是一组三元组。集合没有顺序,您不能假设添加三元组的顺序与稍后取出它们的顺序相同。
  • 对。 Set 不保证订购。我想如果我使用 model.createSeq() 在模型上创建序列,它会在我添加时保留三元组的顺序。 Seq 接口是否只保证主题的顺序而不保证每个三元组/语句?

标签: java rdf apache-jena


【解决方案1】:

虽然这个问题很老了,但这是一个反复出现的问题:在一组三元组中保持顺序的唯一方法是具体化三元组并引入一个显式属性来对序列进行编码。所以,而不是做

:my :first :triple.
:my :other :triple.

你可以的

:s1 rdfs:subject :my; rdfs:predicate :first; rdfs:object :triple.
:s2 rdfs:subject :my; rdfs:predicate :other; rdfs:object :triple.
:s1 my:next :s2.

或者,更紧凑(但也更不可读):

[ rdfs:subject :my; rdfs:predicate :first; rdfs:object :triple;
  my:next
  [ rdfs:subject :my; rdfs:predicate :other; rdfs:object :triple ] ]

真正的麻烦开始了,如果你成功地编码了一个序列,但是你不能在一个聚合中维护它。没有可靠的解决方法。

以下内容可能有效,也可能无效。没有保证,并且取决于您的查询优化器,它可能会失败......这将符合 SPARQL 语义。

SELECT ?preds
WHERE {
  ?first my:next [].
  MINUS { [] my:next ?first }
  # we establish that ?first is the first in a series of statements
  { SELECT ?first (GROUP_CONCAT(?pred; separator="/") as ?preds)
    WHERE { 
      ?first my:next*/rdfs:predicate ?p.
      BIND(str(?p) as ?pred)
    } GROUP BY ?first
  }
}

天真的期望是保留 ?preds 中出现的顺序。这不能保证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多