Thank you very much! Wei Bai
On Wed, May 29, 2013 at 8:35 PM, Dave Reynolds <[email protected]>wrote: > Good answer. > > The one thing I would add is for Wei Bei to think about whether rules are > really appropriate here at all or whether the underlying job might be > better tackled via a SPARQL query. > > Dave > > > On 29/05/13 13:26, Joshua TAYLOR wrote: > >> On Wed, May 29, 2013 at 1:19 AM, Bai Wei <[email protected]> wrote: >> >>> I want to find the cheapest book from some book sellers, so I write one >>> rule to compare the price of the same book that is sold by different >>> sellers. >>> >>> For example, there are three sellers. The price for the book "Intro to >>> Semantic web" of each seller is 19 , 23 and 17. To find the cheapest one >>> I >>> compare them as follows: >>> >>> First step: min(19,23) ->19 (19 is the current minimum value) >>> Second step: min(19, 17) -> 17 (Here we find the cheapest value 17) >>> >>> The problem I faced is how to pass the variable ?currentmin(19 in the >>> above >>> example) to the following rule: >>> >>> [cheapestbook: (?b rdf:type ex:cheapestbook) >>> <- >>> (?b rdf:type ex:book) >>> (?b ex:hasPrice ?p) >>> lessThan(?p, ?currentmin)] >>> >> >> I'd think something like : >> >> [cheapestbook: (?b rdf:type ex:cheapestbook) >> <- >> (?b rdf:type ex:book) >> (?b ex:hasPrice ?p) >> lessThan(?p, ?currentmin) >> currentMin(?currentmin) ] >> >> would work where currentMin is a custom built-in [1] that you define. >> If the value for ?currentmin isn't something that can be computed by >> Jena rules, then you don't seem to have another option. You didn't >> mention where the value of currentmin came from, after all. If you >> can compute it using Jena rules, then you could just write a >> corresponding rule >> >> [currentmin: ( ?currentmin 'is' 'currentMin' ) >> <- >> …] >> >> The Jena rules allow patterns that aren't valid RDF, so you have lots >> of flexibility in deciding how you want to flag a special value like >> ?currentMin. (?currentmin 'is' 'currentMin') probably isn't >> conventional, but you can really use whatever you want, so long as you >> can write a pattern to match against it in the other rules. >> >> Of course, if the value really is fixed, e.g., 19, you can just do: >> >> [cheapestbook: (?b rdf:type ex:cheapestbook) >> <- >> (?b rdf:type ex:book) >> (?b ex:hasPrice ?p) >> lessThan(?p, 19) ] >> >> since Jena's rules support numbers. >> >> [1] http://jena.apache.org/**documentation/javadoc/jena/** >> com/hp/hpl/jena/reasoner/**rulesys/Builtin.html<http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/reasoner/rulesys/Builtin.html> >> >> >
