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