Suggested solution to own problem.

Hi Martin,

seems there are two problems.

The first is that you with your call RDFList.sameListAs(RDFList) are comparing against lists that you might already have deleted from the model (in a previous iteration of the for loop). A solution is to "safekeep" the contents of the 'old' list in a java list and compare the model's lists as java lists:

public static void substituteNonEmptyRDFList (Model model, RDFList old, RDFList fresh) {

  List<RDFNode> oldContent = old.asJavaList();
  List<RDFNode> oldHeads = new ArrayList<>();

  for (RDFList l : getNonEmptyRDFLists(model)) {
    if (oldContent.equals(l.asJavaList())){
      l.removeList();
      oldHeads.add(l);
   }
 }

  // replace pointers to old lists to new copies of fresh lists:
  for (RDFNode n : oldHeads) {
    RDFList freshCopy = fresh.copy();                           
    for (Statement s: model.listStatements(null, null, n).toList()) {
      s.changeObject(freshCopy);
    }
  }
}

The second problem seems to be with how Jena's RDFListImpl copies RDFLists, adding rdf:type rdf:List to all list items. In RDFListImpl.newListCell the following comment

Note: following the RDF WG decision, we no longer assert rdf:type rdf:List for list cells

suggests that this is not necessary.

In RDFListImpl.copy, replacing

1121  Resource cell = getModel().createResource( cellType );

with

1121  Resource cell = getModel().createResource();

seems to fix the problem.

Cheers,
Martin

On 20/04/17 21:46, Martin G. Skjæveland wrote:
Dear list,

I want to replace all the RDF lists in a model which have contents equal
to given input RDF list 'old' with a copies of an RDF list 'fresh'.

Following the advise in
https://jena.apache.org/documentation/javadoc/jena/org/apache/jena/rdf/model/RDFList.html#removeList--,
I remove all lists equal to 'old' and update old's heads to new copies
of fresh.

However, running the code has two results, either it fails with the
exception:

Exception in thread "main"
org.apache.jena.shared.PropertyNotFoundException:
http://www.w3.org/1999/02/22-rdf-syntax-ns#first
    at
org.apache.jena.rdf.model.impl.ModelCom.getRequiredProperty(ModelCom.java:1231)

    at
org.apache.jena.rdf.model.impl.ResourceImpl.getRequiredProperty(ResourceImpl.java:172)

    at
org.apache.jena.rdf.model.impl.RDFListImpl.sameListAs(RDFListImpl.java:876)
    at ListTest.substituteNonEmptyRDFList(ListTest.java:39)
    at ListTest.main(ListTest.java:65)


or it outputs a model where the replaced list seems OK, but does not
seem to be recognized as a proper RDF list (due to the lack of terse
list formatting):

@prefix ex:    <http://example.com#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

ex:fresh1  ex:hasList  ( ex:B1 ex:B2 ) .

ex:old1  ex:hasList  [ a          rdf:List ;
                       rdf:first  ex:B1 ;
                       rdf:rest   [ a          rdf:List ;
                                    rdf:first  ex:B2 ;
                                    rdf:rest   ()
                                  ]
                     ] .

Running code example and input data attached.

Grateful for all help.

Regards,
Martin G. Skjæveland

Reply via email to