/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.engine.optimizer.reorder;
import static org.apache.jena.sparql.engine.optimizer.reorder.PatternElements.TERM ;
import static org.apache.jena.sparql.engine.optimizer.reorder.PatternElements.VAR ;
import org.apache.jena.sparql.engine.optimizer.Pattern ;
import org.apache.jena.sparql.engine.optimizer.StatsMatcher ;
import org.apache.jena.sparql.graph.NodeConst ;
import org.apache.jena.sparql.sse.Item ;
/**
* Alternative fixed reorder function. This corresponds to the algorithm prior
* to Jena 2.11.2. It is susceptable to picking bad orders when there are lots
* of non-characterstic (non-selective) rdf:type triples.
* <p>
* The default "ReorderFixed" is better in most cases because it avoids
* "? rdf:type T" which can be very unselective. Being data independent, that is
* a guess. Consider using the stats matcher for detailed control.
*/
public class ReorderFixedAlt extends ReorderTransformationSubstitution
{
public ReorderFixedAlt() {}
// Fixed scheme for when we have no stats.
// It chooses a triple pattern by order of preference.
private static Item type = Item.createNode(NodeConst.nodeRDFType) ;
/** The number of triples used for the base scale */
public static int MultiTermSampleSize = 100 ;
/** Maximum value for a match involving two terms. */
public static int MultiTermMax = 9 ;
public final static StatsMatcher matcher ;
static {
matcher = new StatsMatcher() ;
//matcher.addPattern(new Pattern(1, TERM, TERM, TERM)) ; // SPO - built-in - not needed a s a rule
// Numbers choosen as an approximation ratios for a graph of 100 triples
matcher.addPattern(new Pattern(2, TERM, TERM, VAR)) ; // SP?
// Pointless - this rule is over ridden by lower weight ?PO
// matcher.addPattern(new Pattern(5, TERM, type, TERM)) ; // ? type O -- worse than ?PO
matcher.addPattern(new Pattern(3, VAR, TERM, TERM)) ; // ?PO
matcher.addPattern(new Pattern(2, TERM, VAR, TERM)) ; // S?O
matcher.addPattern(new Pattern(10, TERM, VAR, VAR)) ; // S??
matcher.addPattern(new Pattern(20, VAR, VAR, TERM)) ; // ??O
matcher.addPattern(new Pattern(30, VAR, TERM, VAR)) ; // ?P?
matcher.addPattern(new Pattern(MultiTermSampleSize, VAR, VAR, VAR)) ; // ???
}
@Override
public double weight(PatternTriple pt)
{
return matcher.match(pt) ;
}
}