Я использую Complexible Pinto для сопоставления Java POJO и RDF. В одном из моих оценочных тестов у меня есть производное свойство, которое не должно появляться в выходных тройках, однако кажется, что все получатели JavaBean автоматически включаются в вывод с генерируемым ресурсом свойств. Как я могу подавить это без искажения имени метода? Подобные структуры обычно имеют некоторую аннотацию @Ignore или параметр аннотации игнорирования, но я не вижу этого в Pinto.Как вы можете исключить определенные свойства POJO для сопоставления с RDF с помощью сложного Pinto?
Я могу подавить это, изменив имя метода (например, xgetNameLength()
), но я бы предпочел не делать этого таким образом, так как это было бы уродливо.
Код:
создать POJO Java, который имеет производное свойство, которое не должно быть переведенным, и преобразовать его в тройки с использованием Пинто.
package pintoeval;
import org.openrdf.model.Graph;
import org.openrdf.model.Resource;
import org.openrdf.model.Statement;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFWriter;
import org.openrdf.rio.Rio;
import com.complexible.pinto.Identifiable;
import com.complexible.pinto.RDFMapper;
import com.complexible.pinto.annotations.RdfProperty;
import com.complexible.pinto.annotations.RdfsClass;
public class PintoStackOverflowQuestion {
@RdfsClass("http://www.example.com/person")
public static class Person implements Identifiable {
private Resource id;
private String name;
@Override
public Resource id() {
return id;
}
@Override
public void id(Resource arg0) {
id = arg0;
}
public String getName() {
return name;
}
@RdfProperty("http://www.example.com/personName")
public void setName(String name) {
this.name = name;
}
/*
* This is directly derived from another value, so it should not be stored.
*/
public int getNameLength() {
return name.length();
}
}
public static void main(String[] args) throws Exception {
Person person = new Person();
person.id(new URIImpl("http://www.example.com/person/Larry0384"));
person.setName("Larry");
Graph aGraph = RDFMapper.create().writeValue(person);
RDFWriter writer = Rio.createWriter(RDFFormat.NTRIPLES, System.out);
writer.startRDF();
for (Statement s : aGraph) {
writer.handleStatement(s);
}
writer.endRDF();
}
}
Выход:
Полученное значение отображается со сгенерированным свойством. Я хотел бы исключить его, так что будут созданы только две тройки.
<http://www.example.com/person/Larry0384> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.example.com/person> .
<http://www.example.com/person/Larry0384> <tag:complexible:pinto:nameLength> "5"^^<http://www.w3.org/2001/XMLSchema#int> .
<http://www.example.com/person/Larry0384> <http://www.example.com/personName> "Larry"^^<http://www.w3.org/2001/XMLSchema#string> .
Попробуйте '@RdfProperty (null)' - это работает? – Bohemian
Я пробовал это, но получаю эту ошибку компиляции 'Значение атрибута аннотации RdfProperty.value должно быть постоянным выражением'. Я получаю ту же ошибку, если я определяю, чтобы установить некоторую фактическую строчную константу в null и использовать ее вместо этого. –
Попробуйте '@RdfProperty (" ")' вместо – Bohemian