I'm going to add a "cartesian" function that create a cartesian product
from a multi-value field. This will turn a single tuple with a multi-value
into multiple tuples with a single value field. This will allow the fetch
operation to work on ancestors. It also has many other use cases. Sample
syntax:

fetch(collection1,
         cartesian(field=ancestors,
                         having(gatherNodes(collection1,

 search(collection1,

 q="*:*",

 fl="conceptid",

 sort="conceptid asc",

 fq=storeid:"524efcfd505637004b1f6f24",

 fq=tags:"Company",

 fq=tags:"Prospects2",

 qt="/export"),

walk=conceptid->eventParticipantID,

gather="eventID",
                                          t
rackTraversal="true",

scatter="leaves",
                                                            count(*)),
                                     gt(count(*),1))),
         fl="concept_name",
         on="ancestors=conceptid")

Joel Bernstein
http://joelsolr.blogspot.com/

On Tue, Mar 14, 2017 at 11:51 AM, Pratik Patel <pra...@semandex.net> wrote:

> Hi, Joel. Thanks for the reply.
>
> So, I need to do some graph traversal queries for my use case. In my data
> set, I have concepts and events.
>
> concept : {name, address, bio ......},
> > event: {name, date, participantIds:[concept1, concept2...] .....}
>
>
> Events connects two or more concepts. So, this is a graph data where
> concepts are connected to each other via events. Each event store links to
> the concepts that it connects. So the field which stores those links is
> multivalued. This is a natural structure for my data on which I wanted to
> do some advanced graph traversal queries with some streaming expression.
> However, gatherNodes() function does not support multivalued fields yet.
> So, I changed my index structure to be something like this.
>
> concept : {conceptId, name, address, bio ......},
> > event: {eventId, name, date, participantIds:[concept1, concept2...]
> .....}
> > *****create eventLink documents for each participantId in each
> > event********
> > eventLink:{eventid, conceptid, id}
>
>
>
> I created eventLink documents from each event so that I can traverse the
> data using gatherNodes() function. With this change, I was able to do graph
> query and get Ids of concepts which I wanted. However, I only have ids of
> concepts. Now, using these ids, I want additional data from concept
> documents like concept_name or address or bio.  This is what I was trying
> to achieve with fetch() function but it seems I hit the multivalued
> limitation again :) The reason why I am storing only the ids in eventLink
> documents is because I don't want to duplicate data unnecessarily. It will
> complicate maintenance of consistency in index when delete/update happens.
> Is there any way I can achieve this?
>
> Thanks!
> Pratik
>
>
>
>
>
> On Tue, Mar 14, 2017 at 11:24 AM, Joel Bernstein <joels...@gmail.com>
> wrote:
>
> > Wow that's an interesting expression!
> >
> > The problem is that you are trying to fetch using the ancestors field,
> > which is multi-valued. fetch doesn't support multi-value join keys. I
> never
> > thought someone might try to do that.
> >
> > So , your attempting to get the concept names for ancestors?
> >
> > Can you explain a little more about the use case?
> >
> >
> > Joel Bernstein
> > http://joelsolr.blogspot.com/
> >
> > On Tue, Mar 14, 2017 at 11:08 AM, Pratik Patel <pra...@semandex.net>
> > wrote:
> >
> > > I have two types of documents in my index. eventLink and concepttData.
> > >
> > > eventLink ---- { ancestors:[<id1>,<id2>] }
> > > conceptData-----{ id:id1, conceptid, concept_name .....<some more
> data> }
> > >
> > > Both are in same collection.
> > > In my query, I am doing a gatherNodes query wrapped in some other
> > function
> > > and ultimately I am getting a bunch of eventLink documents. Now, I am
> > > trying to get conceptData document for each id specified in eventLink's
> > > ancestors field. I am trying to do that using fetch() function. Here is
> > > simplified form of my query.
> > >
> > > fetch(collection1,
> > > >  function to get eventLinks,
> > > >   fl="concept_name",
> > > >   on="ancestors=conceptid"
> > > > )
> > >
> > >
> > > On executing this query, I am getting back same set of documents which
> > are
> > > results of my streaming expression containing gatherNodes() function.
> No
> > > fields are added to the tuples. From documentation, it seems like fetch
> > > would fetch additional data and add it to the tuples. However, that is
> > not
> > > happening. Resulting tuples does not have concept_name field in them.
> > What
> > > am I missing here? I really need to get this additional data from one
> > solr
> > > query so that I don't have to iterate over the eventLinks and get
> > > additional data by individual queries. That would badly impact
> > performance.
> > > Any suggestions?
> > >
> > > Here is my actual query and the response.
> > >
> > >
> > > fetch(collection1,
> > > >  having(
> > > > gatherNodes(collection1,
> > > > search(collection1,q="*:*",fl="conceptid",sort="conceptid
> > > > asc",fq=storeid:"524efcfd505637004b1f6f24",fq=
> tags:"Company",fq=tags:"
> > > Prospects2",
> > > > qt="/export"),
> > > > walk=conceptid->eventParticipantID,
> > > > gather="eventID",
> > > > trackTraversal="true", scatter="leaves",
> > > > count(*)
> > > > ),
> > > > gt(count(*),1)
> > > > ),
> > > > fl="concept_name",
> > > > on="ancestors=conceptid"
> > > > )
> > >
> > >
> > >
> > > Response :
> > >
> > > {
> > > > "result-set": {
> > > > "docs": [
> > > > {
> > > > "node": "524f03355056c8b53b4ed199",
> > > > "field": "eventID",
> > > > "level": 1,
> > > > "count(*)": 2,
> > > > "collection": "collection1",
> > > > "ancestors": [
> > > > "524f02845056c8b53b4e9871",
> > > > "524f02755056c8b53b4e9269"
> > > > ]
> > > > },
> > > > .........
> > > > }
> > >
> > >
> > > Thanks,
> > > Pratik
> > >
> >
>

Reply via email to