Andy,

I went back over the code and the addWhere clause in question takes 3
objects.  It runs each of those through a makeNode() method which
determines what type of Node it should be.

Null = Node.ANY
FrontsNode = Node
Node = Node
String -> attempt to parse as prefix:localName fail to default
default -> createLiteral.

So in the example it should be a quoted string.

Code below.

public Node makeNode(Object o) {
        if (o == null) {
            return Node.ANY;
        }
        if (o instanceof FrontsNode) {
            return ((FrontsNode) o).asNode();
        }

        if (o instanceof Node) {
            return (Node) o;
        }
        if (o instanceof String) {
            try {
                return NodeFactoryExtra.parseNode((String) o, PrefixMapFactory
                        .createForInput(query.getPrefixMapping()));
            } catch (RiotException e) {
                // expected in some cases -- do nothing
            }

        }
        return NodeFactory.createLiteral(LiteralLabelFactory.create(o));
    }

On Thu, Dec 4, 2014 at 4:56 PM, Andy Seaborne <[email protected]> wrote:
> On 04/12/14 15:08, Claude Warren wrote:
>>
>> Not sure if this will solve all the problems but have you looked at
>> the QueryBuilder?
>>
>> http://jena.apache.org/documentation/extras/querybuilder/index.html
>
>
> Claude,
>
> the document seem to have suffered at some point, with some missing
> characters at ends of lines.
>
> I have fixes but SVN is unwell ATM
>
> This one I was unclear about:
>
> sb2.addPrefix( "foaf", "http://xmlns.com/foaf/0.1/"; ).addWhere( ?s,
> RDF.type, foaf:Person)
>
> What's  foaf:Person  in this case? FOAF.Person? (A string would be a literal
> string wouldn't it?)
>
>         Andy
>
>
>>
>> I would be interested to know how it stacks up against your
>> performance requirements.
>>
>> Claude
>>
>> On Thu, Dec 4, 2014 at 3:01 PM, Kristian Rosenvold
>> <[email protected]> wrote:
>>>
>>> We have been troubled by lots of overhead for SPARQL parsing in our
>>> code base, and I have been looking for something like the
>>> "preparedstatement" of sql with the ability to pre-interpret the
>>> statement and set parameters upon execution. Digging around on QA
>>> sites and in the code base I have come up with the following code:
>>>
>>> private static final Query q1template = .. create query with ?param
>>> expression...
>>> ...
>>> QuerySolutionMap params = new  QuerySolutionMap();
>>> params.add("param", myresource);
>>> QueryExecution exec = QueryExecutionFactory.create(q1template,
>>> model,params);
>>>
>>> This doubled the speed of our code, since the SPARQL parsing is pretty
>>> heavy and can be made a "constant" part like an sql preparedstatement.
>>>
>>> Now this does not really work, since there is mutable state in
>>> q1template and it can't be shared (it fails in setResultVars
>>> intermittently - and possibly other places too). Looking at the code
>>> base I see that there seem to be several potential gotchas that are
>>> probably lurking right under the hood, there are  too many per-request
>>> bits and pieces of state that are kept in the Query.
>>>
>>> Not giving up that easily, I created the following method:
>>>
>>> public static Query copyOf(Query query){
>>>     Query copy = new Query(query);
>>>     copy.setQueryPattern(query.getQueryPattern());
>>>     if ( query.isSelectType()) copy.setQuerySelectType();
>>>     else if (query.isAskType()) copy.setQueryAskType();
>>>     else if (query.isConstructType()) copy.setQueryConstructType();
>>>     else if (query.isDescribeType()) copy.setQueryDescribeType();
>>>
>>>     if (query.hasOrderBy()){
>>>        for (SortCondition sortCondition : query.getOrderBy()) {
>>>           copy.addOrderBy(sortCondition);
>>>        }
>>>     }
>>>     return copy;
>>> }
>>>
>>>
>>> And now I can seemingly use
>>>
>>> QueryExecution exec = QueryExecutionFactory.create(copyOf(q1template),
>>> model,params);
>>>
>>> and actually get this working concurrently with re-use of the parsed
>>> sparql expression. But of course there's ElementSubQuery pointing back
>>> at the Query object, so a deep copy of the queryPattern Element
>>> structure would probably also be required, which all seems a bit like
>>> barking up the wrong tree. And I'm not really sure I understand all
>>> the cross-references well enough to know that this would even
>>> work....(?)
>>>
>>> It would seem to me that the "clean" thing to do would be to separate
>>> the parsed sparql from the per-request state. By simple name it would
>>> sound like "QueryExecution" would be a nice place for these things.
>>> Would this work, is it a good idea ?
>>>
>>> Alternately (and much simpler), one could simply make a "reset" method
>>> on the Query object and accept sequential re-use. In that way I could
>>> use ThreadLocals to keep one instance of the query per thread and
>>> reduce the overall sparql parsing.
>>>
>>> I'm sort of digging a bit for suggestions/ideas here, since I'm not
>>> all that familiar with the code base :) We're talking about a fairly
>>> heavy CO2 footprint in terms of energy expenditure for repeated
>>> parsing of all that sparql :)
>>>
>>> (Initially I adressed this to the "users" list but I sort of changed
>>> my mind as the details got gorier and gorier....)
>>>
>>> Kristian
>>
>>
>>
>>
>



-- 
I like: Like Like - The likeliest place on the web
LinkedIn: http://www.linkedin.com/in/claudewarren

Reply via email to