Это на самом деле немного сложно, если у вас нет доступных выводов, потому что ряд свойств фактически используется для указания членства в RDF-контейнере. Например, вот модель с тремя сумками, первая и третья из которых содержат ресурсы x и y:
@prefix : <http://stackoverflow.com/q/23568540/1281433/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
:Bag1 a rdf:Bag ;
rdf:_1 :x ;
rdf:_2 :y .
:Bag2 a rdf:Bag ;
rdf:_1 :y .
:Bag3 a rdf:Bag ;
rdf:_1 :y ;
rdf:_2 :x .
Проблема, конечно, в том, что свойства, которые первая и третья присваивают, например, ресурс x, не совпадают. Однако каждое из этих rdf:_nnn
свойств является экземпляром rdfs:ContainerMembershipProperty
. В свою очередь, каждое rdfs:ContainerMembershipProperty является суперсвойством rdfs:member
. Это означает, что если у вас есть рассудок, который может сделать такой вывод, вы можете спросить, какие ресурсы имеют x (или y) как rdfs:member
. Не похоже (как показано в следующем примере), что алгоритмы рассуждений Jena RDFS делают это. Таким образом, вам, возможно, придется просто перебрать операторы, которые имеют x в качестве объекта, и проверить, является ли свойство свойством членства в контейнере.
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.Bag;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ResIterator;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;
public class BagExample {
public static void main(String[] args) {
Model model = ModelFactory.createDefaultModel();
String NS = "http://stackoverflow.com/q/23568540/1281433/";
model.setNsPrefix( "", NS );
model.setNsPrefix( "rdf", RDF.getURI() );
Bag bag1 = model.createBag( NS+"Bag1" );
Bag bag2 = model.createBag( NS+"Bag2" );
Bag bag3 = model.createBag( NS+"Bag3" );
Resource x = model.createResource( NS+"x" );
Resource y = model.createResource( NS+"y" );
bag1.add( x ).add( y );
bag2.add( y );
bag3.add( y ).add( x );
RDFDataMgr.write( System.out, model, Lang.TURTLE );
System.out.println( "=== Bags with X (no inference) ===" );
ResIterator bagsWithX = model.listSubjectsWithProperty( RDFS.member, x );
while ( bagsWithX.hasNext() ) {
System.out.println( bagsWithX.next() );
}
System.out.println( "=== Bags with X (RDFS inference) ===" );
OntModel rdfsModel = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_TRANS_INF, model );
bagsWithX = rdfsModel.listSubjectsWithProperty( RDFS.member, x );
while ( bagsWithX.hasNext() ) {
System.out.println( bagsWithX.next() );
}
System.out.println( "=== Bags with X (manual checking) ===" );
StmtIterator xStmts = model.listStatements( null, null, x );
while ( xStmts.hasNext() ) {
Statement s = xStmts.next();
// This checks whether the URI begins with rdf:_. A proper
// solution would make sure that the suffix is actually numeric.
// You might also want to check whether the subject actually is
// a Bag. It could be a member of other kinds of containers, too.
if ( s.getPredicate().getURI().startsWith( RDF.getURI()+"_" ) ) {
System.out.println( s.getObject() );
}
}
}
}
=== Bags with X (no inference) ===
=== Bags with X (RDFS inference) ===
=== Bags with X (manual checking) ===
http://stackoverflow.com/q/23568540/1281433/x
http://stackoverflow.com/q/23568540/1281433/x
person
Joshua Taylor
schedule
09.05.2014
Bag.add
, который добавляет операторы в модель. В конце концов, интерфейс Bag — это просто удобный слой поверх троек в модели. - person Joshua Taylor   schedule 09.05.2014