AGFreetextSearch.java

package com.franz.agbase.examples;

import com.franz.agbase.*;

public class AGFreetextSearch {

    /**
     * Demonstrates some basics of Freetext search 
     *
     * @param args unused
     * @throws AllegroGraphException
     */
    public static void main(String[] args) throws AllegroGraphException {       
        // Connect to server, which must already be running.
        AllegroGraphConnection ags = new AllegroGraphConnection();
        try {
            ags.enable();
        } catch (Exception e) {
            throw new AllegroGraphException("Server connection problem", e);
        }

        // Create a fresh triple store
        AllegroGraph ts = ags.renew("freetextsearch", AGPaths.TRIPLE_STORES);

        // Register a namespace
        ts.registerNamespace("ex", "http://example.org/");
        
        // Register any predicates whose objects are to be searched.
        // Only triples added or loaded after the registration will
        // be included in the index.
        ts.registerFreetextPredicate("<http://www.w3.org/2000/01/rdf-schema#comment>");
        ts.registerFreetextPredicate("!ex:notes");
        
        // Add some triples to the store.  Triples involving registered predicates will be 
        // indexed for free-text search, others will not.
        ts.addStatement("!ex:jans", "!rdfs:comment", "\"Born in Emmen in the Netherlands\"");
        ts.addStatement("!ex:gary", "!rdfs:comment", "\"Born in Springfield in the USA\"");
        ts.addStatement("!ex:henk", "!rdfs:label", "\"Born in Emmermeer in the Netherlands\"");
        ts.addStatement("!ex:alice", "!ex:notes", "\"wasn't born in Wonderland.\"");
        ts.addStatement("!ex:bob", "!ex:notes", "\"your uncle.\"");
        ts.addStatement("!ex:fred", "!ex:notes", "\"Lives in Bedrock.\"");
        ts.addStatement("!ex:stanley", "!ex:notes", "\"Dr. Livingstone I presume?\"");
        ts.addStatement("!ex:fibonacci", "!ex:notes", "\"fib(n+2) = fib(n+1) + fib(n)\"");
        
        // Search for statements whose object contains the word born -- note that
        // search is case insensitive
        String query = "'born'";
        System.out.println("Search: " + query);
        TriplesIterator cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Search for statements whose object contains words emmen and born
        query = "(and 'emmen' 'born')";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Search for statements whose object contains words Wonderland or Bedrock
        query = "(or 'Wonderland' 'Bedrock')";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Words of 2 chars or less are not indexed
        query = "(or 'in' 'a')";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Some common words, called "stop words", are also not indexed
        query = "'the'";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Some characters, such as '(' and ')' delimit tokens.
        // Note: 'fib(x)' will tokenize as "fib" and "x", and "x"
        // will be ignored having < 2 letters, so it's really a 
        // search for 'fib'.  Try searching for 'fib(xxx)' and 
        // note the different results.
        query = "'fib(x)'";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Match a single character with '?'
        query = "'Liv??'";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Match a sequence of characters with '*'
        query = "'Liv*'";
        System.out.println("Search: " + query);
        cc = ts.getFreetextStatements(query);
        AGUtils.showTriples(cc);
        
        // Search for subjects whose object contains Wonderland or Bedrock
        query = "(or 'Wonderland' 'Bedrock')";
        ValueSetIterator it = ts.getFreetextUniqueSubjects(query);
        System.out.println("Subjects matching search: " + query);
        AGUtils.showResults(it);
        
        // Close the triple store and disconnect from the server
        ts.closeTripleStore();
        ags.disable();
    }

}

Up | Next

Copyright © 2023 Franz Inc., All Rights Reserved | Privacy Statement Twitter