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