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 > > > > > >