0

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

4

1 回答 1

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 中出现的顺序。这不能保证。

于 2021-10-06T19:54:00.233 回答