You're on the right track, yes. Generally speaking seeds are undifferentiated
values. They might be subject, object, or even predicate values.
For sem:transitive-closure the assumption is that your data uses the same
values for subject and object, in relationships like "A => B", "B => C". So the
seed values are subjects or objects, depending on the $direction argument. If
$direction is true then seeds are subject values. Otherwise they are object
values.
if ($direction) then sem:object-for-subject-predicate($seeds, $relation)
else sem:subject-for-object-predicate($seeds, $relation)
In sem:transitive-closure, filters are used as predicate tests for subjects or
objects, depending on direction. However it looks like they only test
subject-predicate tuples. That might be a bug, or maybe not. It's been a while
since I've looked at that code.
-- Mike
On 17 Jan 2013, at 05:41 , "Steiner, David J. (LNG-DAY)"
<[email protected]> wrote:
> Hi Mike,
>
> Yes, I saw the example, I think you're referring to:
> xquery version "1.0-ml";
>
> import module namespace sem="http://marklogic.com/semantic"
> at "semantic.xqy";
>
> let $m := map:map()
> let $seeds := xdmp:get-request-field('seed')
> let $filters as xs:string* := xdmp:get-request-field('filter')
> let $gen := 6
> return sem:transitive-closure(
> $m, $seeds, $gen,
> 'http://xmlns.com/foaf/0.1/knows',
> true(), $filters
> )
>
> And I've seen the description of the parameters:
>
> $m as map:map,
> $seeds as xs:string*,
> $gen as xs:integer, $relation as xs:string,
> $direction as xs:boolean,
> $filters as xs:string*
>
> But that doesn't really tell me what is in a "seed" since there's no real
> example of the value(s). It's a string, I get it.
> For instance what does the "seeds" look like if you have more than one?
> I'm assuming you can have more than one by the implication of the name
> "seeds".
>
> The comment in the code states:
> $seeds - This stores unfiltered results, and it's used recursively for
> finding the next generation of friends
>
> And the first thing that functions seem to do is:
> count($seeds)
>
> So, I'm assuming that depending on the direction you pick, the seed you pass
> for the subject or object looks something like this:
> let $seeds as xs:string* := ("urn:1234", "urn:2345", "urn:3456")
>
> Likewise, I assume the same for $filters, but that they are applicable to the
> opposite of the seeds (if direction is true(), then seeds are subjects and
> filters are objects, and vice versa if direction is false()). Is that
> correct?
>
> Thanks,
> David
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Michael Blakeley
> Sent: Wednesday, January 16, 2013 6:53 PM
> To: MarkLogic Developer Discussion
> Subject: Re: [MarkLogic Dev General] Using Semantic library correctly?
>
> Seed values are the starting values for an operation. For example if you want
> to calculate Kevin Bacon's friends to seven generations, the seed value would
> represent Kevin Bacon. There is an example for for sem:transitive-closure()
> at http://marklogic.github.com/semantic/
>
> Does your example do what you want? I think so, but I haven't worked through
> it completely. Another way might two sem:subject-for-predicate() calls, and a
> map operation for the join. That might be faster for a simple case like this.
>
> -- Mike
>
> On 16 Jan 2013, at 11:26 , "Steiner, David J. (LNG-DAY)"
> <[email protected]> wrote:
>
>>
>> Looking into using some tuples in ML, so I want to make sure I am using the
>> functions correctly. I loaded 721 million tuples, so spot checking results
>> is less than reassuring since results are huge.
>>
>> A side note/question: I'm not sure I completely understand the format for
>> "seeds" and neither the reference nor the overview have an example where it
>> is used. I'm not sure I want to use it just yet, but it would be nice if
>> someone has a better explanation of what a seed would look like for some of
>> the functions that take them.
>>
>> At any rate, I've come to the point of where I want to do something like:
>> show me the subjects that have a tuple that has a predicate with value1 and
>> also a tuple with value2. My current attempt at this is:
>>
>> xquery version "1.0-ml";
>>
>> import module namespace sem="http://marklogic.com/semantic"
>> at "/modules/djs/semantic.xqy";
>>
>> let $results := sem:subject-for-join(
>> (sem:object-predicate-join(
>> 'this',
>> 'predicate1'),
>> sem:object-predicate-join(
>> 'that',
>> 'predicate2')
>> ))
>>
>> return
>> fn:count($results)
>>
>> I've spot checked several of the results (i.e., I get the subjects and look
>> at the tuples for those subjects) and have not come across any that aren't
>> correct (they have both of the predicate-object combos that I've specified).
>>
>> For those in the know, am I using these correctly?
>>
>> Thanks,
>> David
>> _______________________________________________
>> General mailing list
>> [email protected]
>> http://developer.marklogic.com/mailman/listinfo/general
>
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general
>
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general