What Mark said above or if you need to differantiate the user id into the 
collection (array in array) like: 

MATCH (n:User { uid:'Pontus Lundin' })-[:REL 1]-(m1), n-[:REL 
2]-(m2),n-[:REL 3]-(m3)
WITH n,collect(DISTINCT[m1.name,m2.name,m3.name]) AS group1
MATCH n -[:REL4]-(m1)
WITH group1,collect(m1.name) AS group2
RETURN group1,group2

You can continue building with with and match.

Den söndagen den 20:e april 2014 kl. 21:33:09 UTC+2 skrev Alx:
>
> Lundin,
>
> Thanks for the reply. Basically I want to do what UNION (
> http://docs.neo4j.org/chunked/stable/query-union.html) does exactly but 
> instead of stopping at the end of return continue with other queries. For 
> example something like this:
>
> MATCH (n:User{id:'1'} - [:REL1] - (m1) RETURN m1.id AS users
> MATCH (n:User{id:'1'} - [:REL2] - (m2) RETURN m2.id AS users
> MATCH (n:User{id:'1'} - [:REL3] - (m3) RETURN m3.id AS users
>
> Then collect the results like 'COLLECT (users) AS group1 ' because it is 
> meaningful that they are grouped together and then continue executing the 
> following queries:
>
> MATCH (n:User{id:'1'} - [:REL4] - (m4) WITH collect(m4.id) AS group 2 ,
> MATCH (n:User{id:'1'} - [:REL5] - (m5) WITH collect(m5.id) AS group 3
>
> And finally return the collections:
>
> RETURN  group1, group2, group3
>
>
> I wonder if this is possible... 
>
> Thanks a lot.
>
>
>
>
> On Sunday, April 20, 2014 2:00:50 PM UTC-4, Lundin wrote:
>>
>> Alx.
>>
>> Wes Freeman wrote a blog post about OPTIONAL match, here:
>> http://wes.skeweredrook.com/cypher-2-0-optional-match/
>> At the bottom he explains the differences between using where before and 
>> after. Also limiting the questions before match seems logical so we dont 
>> have to match all users and then say but we are only intrested of user with 
>> a given property.
>>
>> For the question about removing duplicates, i have no answer for the 
>> result as it is now with two collections. But i fail to see how that 
>> output, the list make any sense other than for testing puropse. How do you 
>> delimit and know what belongs to what query ?
>> What do you want from the query ? 
>>
>> For me this one seems to fit a purpose:
>>  
>> MATCH (n:User)
>> WHERE HAS (n.uid)
>> OPTIONAL
>> MATCH (n)-[:LOCATED_IN]->()<-[:LOCATED_IN]-(m)
>> WITH n,(m.name) AS users
>> MATCH (n)-[:TEXTED]->(k)
>> WHERE k.name<>users
>> RETURN users,collect(k.name) AS texted_users,count(k.name) AS NoUserText
>>
>> This one list user that fullfulls the 
>> (n)-[:LOCATED_IN]->()<-[:LOCATED_IN]-(m) pattern and list them in the first 
>> column (from my perspective that is some kind of search of people that has 
>> no uid but is LOCATED_IN same as users with a uid). 
>> The next column lists all users where users with an uid has TEXTED to and 
>> removes the user in the first column (if he exists in the TEXTED list) (for 
>> me that is some kind of recommendation or analytic search)
>>
>> Of course you can add distinct to the various columns if a person has 
>> texted to the same user multiple times.
>>
>> You can also look into what UNION does for MATCH based queries as well.
>>
>>
>> Den söndagen den 20:e april 2014 kl. 18:20:02 UTC+2 skrev Alx:
>>>
>>> Hi Lundin,
>>>
>>> Thanks for the elaborate response. I can understand your thinking and it 
>>> is helpful. The point is: what is it more efficient? a) To first find users 
>>> with uid and then try to optional match a pattern?  b) Or try to optional 
>>> match the pattern and after that keep ('WHERE' command) only those results 
>>> that users have uids?
>>>
>>>
>>> I still have the question: how do I remove the duplicates from the 
>>> combined users1+ users2 list? Any suggestions?
>>>
>>>
>>> On Saturday, April 19, 2014 11:23:29 PM UTC-4, Lundin wrote:
>>>>
>>>> Hi Alx,
>>>>
>>>> Most probably because your data/graph simply not fullful your total 
>>>> cypher statement, Remeber that your are matchning a pattern and you start 
>>>> with limiting it to users that has a uid property. For example the graph 
>>>> data below returns a resultset for each individually MATCH queries, 
>>>> however 
>>>> once chained, like your query, it fails to match that pattern. That is 
>>>> becuse there is no User that has uid property and other nodes that are 
>>>> connected via the LOCATED_IN (the cities they are living in) relationship, 
>>>> thus your query will return nil in the end.
>>>>
>>>> So with this graph data: 
>>>>
>>>> CREATE (Pontus:User { uid:'Pontus Lundin',name:'Pontus Lundin' 
>>>> }),(John:User { uid: 'John Hellberg',name:'John Hellberg' }),(Jack:User { 
>>>> uid: 'Jack Hellberg',name:'Jack Hellberg' }),(Nisse:User { name: 'Nisse 
>>>> Larsson' }),(Kalle:User { name: 'Kalle Johansson' }),(Johan:User { 
>>>> name:'Johan Davidsson' }),(Ronny:User { name: 'Ronny Stork' }),(Micke:User 
>>>> { name: 'Mikael Jansson' }),(Anna:User { name: 'Anna Karlsson', 
>>>> sex:'female' }),(Sandra:User { name: 'Sandra Johansson', sex:'female' 
>>>> }),(Fredrik:User { name:'Fredrik Hansson' }),(Gothenburg:Location { 
>>>> name:'Gothenburg',dailyhits:1000000 }),(Stockholm:Location { 
>>>> name:'Stockholm',dailyhits:300000 }),(Sundsvall:Location { 
>>>> name:'Sundsvall',dailyhits:6000 }),(Malmo:Location { 
>>>> name:'Malmö',dailyhits:20000 }),
>>>> (Pontus)-[:LOCATED_IN]->(Gothenburg),
>>>> (Ronny)-[:LOCATED_IN]->(Sundsvall),
>>>> (Sandra)-[:LOCATED_IN]->(Sundsvall),
>>>> (Pontus)-[:TEXTED]->(Sandra),
>>>> (Pontus)-[:TEXTED]->(Fredrik),
>>>> (Jack)-[:LOCATED_IN]->(Malmo),
>>>> (John)-[:LOCATED_IN]->(Stockholm),
>>>> (Jack)-[:TEXTED]->(Pontus);
>>>>
>>>>
>>>> This pattern will return data:
>>>>
>>>> MATCH (n:User)
>>>> WHERE HAS (n.uid)
>>>> return n;
>>>>
>>>>
>>>> As well as:
>>>> MATCH (n)-[:LOCATED_IN]->()<-[:LOCATED_IN]-(m),(n)-[:TEXTED]-(k)
>>>> WITH COLLECT(DISTINCT m.name) AS users1, COLLECT(DISTINCT k.name) AS 
>>>> users2
>>>> RETURN users1+ users2
>>>>
>>>> But not this chained Cypher query which return empty
>>>>
>>>> MATCH (n:User)
>>>> WHERE HAS (n.uid)
>>>> MATCH (n)-[:LOCATED_IN]->()<-[:LOCATED_IN]-(m),(n)-[:TEXTED]-(k)
>>>> WITH COLLECT(DISTINCT m.name) AS users1, COLLECT(DISTINCT k.name) AS 
>>>> users2
>>>> RETURN users1+ users2
>>>>
>>>>
>>>> However if your data has connection that fullfulls your query then it 
>>>> works (now a User with uid lives in the same city as another node), like:
>>>>
>>>> CREATE (Pontus:User { uid:'Pontus Lundin',name:'Pontus Lundin' 
>>>> }),(John:User { uid: 'John Hellberg',name:'John Hellberg' }),(Jack:User { 
>>>> uid: 'Jack Hellberg',name:'Jack Hellberg' }),(Nisse:User { name: 'Nisse 
>>>> Larsson' }),(Kalle:User { name: 'Kalle Johansson' }),(Johan:User { 
>>>> name:'Johan Davidsson' }),(Ronny:User { name: 'Ronny Stork' }),(Micke:User 
>>>> { name: 'Mikael Jansson' }),(Anna:User { name: 'Anna Karlsson', 
>>>> sex:'female' }),(Sandra:User { name: 'Sandra Johansson', sex:'female' 
>>>> }),(Fredrik:User { name:'Fredrik Hansson' }),(Gothenburg:Location { 
>>>> name:'Gothenburg',dailyhits:1000000 }),(Stockholm:Location { 
>>>> name:'Stockholm',dailyhits:300000 }),(Sundsvall:Location { 
>>>> name:'Sundsvall',dailyhits:6000 }),(Malmo:Location { 
>>>> name:'Malmö',dailyhits:20000 }),
>>>> (Pontus)-[:LOCATED_IN]->(Sundsvall),
>>>> (Ronny)-[:LOCATED_IN]->(Sundsvall),
>>>> (Sandra)-[:LOCATED_IN]->(Sundsvall),
>>>> (Pontus)-[:TEXTED]->(Sandra),
>>>> (Pontus)-[:TEXTED]->(Fredrik),
>>>> (Jack)-[:LOCATED_IN]->(Malmo),
>>>> (John)-[:LOCATED_IN]->(Stockholm),
>>>> (Jack)-[:TEXTED]->(Pontus);
>>>>
>>>>
>>>>
>>>> If you still want to return *something* (if it makes sense for your 
>>>> result) event though the "match fails" you can use the OPTIONAL match like 
>>>> the one below:
>>>>
>>>> MATCH (n:User)
>>>> WHERE HAS (n.uid)
>>>> OPTIONAL
>>>> MATCH (n)-[:LOCATED_IN]->()<-[:LOCATED_IN]-(m)
>>>> WITH n,m
>>>> MATCH (n)-[:TEXTED]-(k)
>>>> WITH COLLECT(DISTINCT m.name) AS users1, COLLECT(DISTINCT k.name) AS 
>>>> users2
>>>> RETURN users1+ users2
>>>>
>>>>
>>>> Den söndagen den 20:e april 2014 kl. 02:00:33 UTC+2 skrev Alx:
>>>>>
>>>>> I have the following cypher query:
>>>>>
>>>>> MATCH (n:User) WHERE HAS(n.uid)  MATCH 
>>>>> (n)-[:LOCATED_IN]->()<-[:LOCATED_IN]-(m),  (n)-[:TEXTED]-(k) WITH  
>>>>> COLLECT 
>>>>> (DISTINCT m.name) AS users1, COLLECT( DISTINCT k.name ) 
>>>>> AS users2 RETURN users1+ users2
>>>>>
>>>>> But it returns me no result.  It just returns a title "users1+ users2". 
>>>>> I know that there are results in the query because I executed them 
>>>>> individually. 
>>>>>
>>>>> My goal is to collect all the results from individual matches and then 
>>>>> count the distinct names. Thanks for the help in advance.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to