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