📄 specializedgraphreifier_rdb.java
字号:
/*
* (c) Copyright 2003 Hewlett-Packard Development Company, LP
* All rights reserved.
*
*/
package com.hp.hpl.jena.db.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.hp.hpl.jena.db.GraphRDB;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.util.iterator.*;
import com.hp.hpl.jena.shared.*;
import com.hp.hpl.jena.vocabulary.RDF;
/**
* @author hkuno
* @version $Version$
*
* TripleStoreGraph is an abstract superclass for TripleStoreGraph
* implementations. By "triple store," we mean that the subjects, predicate
* and object URI's are stored in a single collection (denormalized).
*
*/
public class SpecializedGraphReifier_RDB
extends SpecializedGraphBase
implements SpecializedGraphReifier {
/**
* holds PSet
*/
public PSet_ReifStore_RDB m_pset;
/**
* caches a copy of LSet properties
*/
public DBPropLSet m_dbPropLSet;
/**
* holds ID of graph in database (defaults to "0")
*/
public IDBID my_GID = null;
// cache of reified statement status
private ReificationCacheMap m_reifCache;
public PSet_ReifStore_RDB m_reif;
// constructors
/**
* Constructor
* Create a new instance of a TripleStore graph.
*/
SpecializedGraphReifier_RDB(DBPropLSet lProp, IPSet pSet, Integer dbGraphID) {
m_pset = (PSet_ReifStore_RDB) pSet;
m_dbPropLSet = lProp;
my_GID = new DBIDInt(dbGraphID);
m_reifCache = new ReificationCacheMap(this, 1);
m_reif = (PSet_ReifStore_RDB) m_pset;
}
/**
* Constructor
*
* Create a new instance of a TripleStore graph, taking
* DBPropLSet and a PSet as arguments
*/
public SpecializedGraphReifier_RDB(IPSet pSet, Integer dbGraphID) {
m_pset = (PSet_ReifStore_RDB) pSet;
my_GID = new DBIDInt(dbGraphID);
m_reifCache = new ReificationCacheMap(this, 1);
m_reif = (PSet_ReifStore_RDB) m_pset;
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraphReifier#add(com.hp.hpl.jena.graph.Node, com.hp.hpl.jena.graph.Triple, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public void add(Node n, Triple t, CompletionFlag complete) throws CannotReifyException {
ReificationStatementMask same = new ReificationStatementMask();
ReificationStatementMask diff = new ReificationStatementMask();
ReificationCache rs = m_reifCache.load(n, t, same, diff);
if (rs == null) {
m_reif.storeReifStmt(n, t, my_GID);
} else {
/* node already reifies something. is that a subset of triple t? */
if ( diff.hasNada() ) {
boolean didUpdate = false;
/* add whatever is missing to reify t */
if ( !same.hasSubj() ) {
Triple st = Triple.create(n,RDF.Nodes.subject,t.getSubject());
m_reif.updateFrag(n, st, new ReificationStatementMask(st), my_GID);
didUpdate = true;
}
if ( !same.hasPred() ) {
Triple pt = Triple.create(n,RDF.Nodes.predicate,t.getPredicate());
m_reif.updateFrag(n, pt, new ReificationStatementMask(pt), my_GID);
didUpdate = true;
}
if ( !same.hasObj() ) {
Triple ot = Triple.create(n,RDF.Nodes.object,t.getObject());
m_reif.updateFrag(n, ot, new ReificationStatementMask(ot), my_GID);
didUpdate = true;
}
if ( !rs.mask.hasType() ) {
Triple tt = Triple.create(n,RDF.Nodes.type,RDF.Nodes.Statement);
m_reif.updateFrag(n, tt, new ReificationStatementMask(tt), my_GID);
didUpdate = true;
}
if ( didUpdate )
fragCompact(n);
m_reifCache.flushAll();
} else {
/* node reifies something that is not a subset of triple t */
if ( rs.mask.isStmt() )
throw new AlreadyReifiedException(n);
else
throw new CannotReifyException(n);
}
}
complete.setDone();
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraphReifier#delete(com.hp.hpl.jena.graph.Node, com.hp.hpl.jena.graph.Triple, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public void delete(Node n, Triple t, CompletionFlag complete) {
m_reifCache.flushAll();
m_reif.deleteReifStmt( n, t, my_GID);
complete.setDone();
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraphReifier#contains(com.hp.hpl.jena.graph.Node, com.hp.hpl.jena.graph.Triple, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public boolean contains(Node n, Triple t, CompletionFlag complete) {
if (true)
throw new JenaException("SpecializedGraphReifier.contains called");
return false;
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraphReifier#findReifiedNodes(com.hp.hpl.jena.graph.TripleMatch, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public ExtendedIterator findReifiedNodes(Triple t, CompletionFlag complete) {
complete.setDone();
return m_reif.findReifStmtURIByTriple(t, my_GID);
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraphReifier#findReifiedTriple(com.hp.hpl.jena.graph.Node, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public Triple findReifiedTriple(Node n, CompletionFlag complete) {
ResultSetReifIterator it = m_reif.findReifStmt(n, true, my_GID, false);
Triple res = null;
if ( it.hasNext() ) {
res = (Triple) it.next();
}
complete.setDone();
return res;
}
/** Find all the triples corresponding to a given reified node.
* In a perfect world, there would only ever be one, but when a user calls
* add(Triple) there is nothing in RDF that prevents them from adding several
* subjects,predicates or objects for the same statement.
*
* The resulting Triples may be incomplete, in which case some of the
* nodes may be Node_ANY.
*
* For example, if an application had previously done:
* add( new Triple( a, rdf.subject A )) and
* add( new Triple( a, rdf.object B )) and
* add( new Triple( a, rdf.object B2 ))
*
* Then the result of findReifiedTriple(a, flag) will be an iterator containing
* Triple(A, ANY, B) and Triple(ANY, ANY, B2).
*
* @param n is the Node for which we are querying.
* @param complete is true if we know we've returned all the triples which may exist.
* @return ExtendedIterator.
*/
public ExtendedIterator findReifiedTriples(Node n, CompletionFlag complete) {
complete.setDone();
return m_reif.findReifStmt(n, false, my_GID, true);
}
/**
* Attempt to add all the triples from a graph to the specialized graph
*
* Caution - this call changes the graph passed in, deleting from
* it each triple that is successfully added.
*
* Node that when calling add, if complete is true, then the entire
* graph was added successfully and the graph g will be empty upon
* return. If complete is false, then some triples in the graph could
* not be added. Those triples remain in g after the call returns.
*
* If the triple can't be stored for any reason other than incompatability
* (for example, a lack of disk space) then the implemenation should throw
* a runtime exception.
*
* @param g is a graph containing triples to be added
* @param complete is true if a subsequent call to contains(triple) will return true for any triple in g.
*/
public void add( Graph g, CompletionFlag complete ) {
throw new AddDeniedException( "sorry, not implemented" );
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraph#add(com.hp.hpl.jena.graph.Triple, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public void add(Triple frag, CompletionFlag complete) throws AlreadyReifiedException {
ReificationStatementMask fragMask = new ReificationStatementMask(frag);
if (fragMask.hasNada())
return;
boolean fragHasType = fragMask.hasType();
Node stmtURI = frag.getSubject();
ReificationCache cachedFrag = m_reifCache.load(stmtURI);
if (cachedFrag == null) {
// not in database
m_reif.storeFrag(stmtURI, frag, fragMask, my_GID);
complete.setDone();
} else {
ReificationStatementMask cachedMask = cachedFrag.getStmtMask();
if (cachedMask.hasIntersect(fragMask)) {
// see if this is a duplicate fragment
boolean dup = fragHasType && cachedMask.hasType();
if (dup == false) {
// not a type fragement; have to search db to check for dup
ExtendedIterator it = m_reif.findFrag (stmtURI, frag, fragMask, my_GID);
dup = it.hasNext();
if ( dup == false ) {
if ( cachedMask.isStmt())
throw new AlreadyReifiedException(frag.getSubject());
// cannot perform a reificiation; store fragment
m_reif.storeFrag(stmtURI, frag, fragMask, my_GID);
m_reifCache.flush(cachedFrag);
}
}
} else {
// reification may be possible; update if possible, else compact
if (cachedFrag.canMerge(fragMask)) {
if ( cachedFrag.canUpdate(fragMask) ) {
m_reif.updateFrag(stmtURI, frag, fragMask, my_GID);
cachedFrag.update(fragMask);
} else
fragCompact(stmtURI);
} else {
// reification not possible
m_reif.storeFrag(stmtURI, frag, fragMask, my_GID);
}
}
}
complete.setDone();
}
/* (non-Javadoc)
* @see com.hp.hpl.jena.db.impl.SpecializedGraph#delete(com.hp.hpl.jena.graph.Triple, com.hp.hpl.jena.db.impl.SpecializedGraph.CompletionFlag)
*/
public void delete(Triple frag, CompletionFlag complete) {
ReificationStatementMask fragMask = new ReificationStatementMask(frag);
if (fragMask.hasNada())
return;
Node stmtURI = frag.getSubject();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -