michael, i will continue to investigate too.
would you like any information from my side?



On Tue, Jan 21, 2014 at 1:56 PM, Michael Hunger <
michael.hun...@neopersistence.com> wrote:

> Interesting, I assumed with 2.0 final it would still use the
> traversal-matcher -> there were some fixes around that in 2.0
>
> Let's check that out and report a GH issue in case it persists.
>
> Michael
>
> Am 21.01.2014 um 20:48 schrieb Javad Karabi <karabija...@gmail.com>:
>
> this is weird... in your example, you got the member node and piped it
> into the next portion, via:
> MATCH (me:Member {id: {member_id}})
> WITH me, me.birth_year as birth_year
>
> im assuming this is so that the comparison on me.birth_year and
> other.birth_year can occur, without having the cross-path comparison issue.
>
> however, when i do that, it looks like the execution plan uses
> PatternMatch as opposed to using TraversalMatcheri , which is preferable,
> as t seems to me that TraversalMatcher has the ability to include WHERE
> predicates as it traverses.
>
> when i include (me:Member {id: {member_id}}) as part of the same 'match'
> clause, however, it looks like TraversalMatcher is selected by the
> execution plan builder, which greatly increases the performance of my
> query...
>
>    -
>
>
>
> On Tue, Jan 21, 2014 at 12:48 PM, Michael Hunger <
> michael.hun...@neopersistence.com> wrote:
>
>> Yes, that's true.
>>
>> cross path meant from different segments of the path.
>>
>> Michael
>>
>> Am 21.01.2014 um 18:37 schrieb Javad Karabi <karabija...@gmail.com>:
>>
>> ah... i think i know what you mean.
>> that is, that i am comparing me.birth_year, and other.birth_year, both of
>> which were part of the same path, so splitting it up like you did (via the
>> WITH me.birth_year) did the trick?
>>
>> On Tuesday, January 21, 2014 11:31:24 AM UTC-6, Javad Karabi wrote:
>>>
>>> Michael, awesome, thank you.
>>>
>>> just to make sure I understand correctly, in this case, when you say
>>> 'cross path comparison',
>>> what are the 2 paths you are referring to?
>>>
>>>
>>> On Tuesday, January 21, 2014 11:21:32 AM UTC-6, Michael Hunger wrote:
>>>>
>>>> Right, cross path comparisons are not yet used to shortcut path-finding
>>>>
>>>> so if you rewrite your query to this, it will actually filter down the
>>>> paths eagerly
>>>>
>>>> MATCH (me:Member {id: 11700})
>>>> WITH me, me.birth_year as birth_year
>>>> MATCH (me)-[ra:preferred_store]->(s)<-[rb:preferred_store]-(other)
>>>> -[rc:ordered]->()<-[rd:product]-(sv:StyleVariant)
>>>> WHERE abs(other.birth_year - birth_year ) <  {age_difference_range} AND
>>>> sv.cached_available = 1
>>>> ....
>>>>
>>>>
>>>>
>>>> Am 21.01.2014 um 18:19 schrieb Javad Karabi <karab...@gmail.com>:
>>>>
>>>> Michael, I apologize, I will send you a copy of the query + profile too.
>>>> In my actual query, I am using a parameter of the cypher query:
>>>> WHERE other.birth_year > (me.birth_year - {age_difference_range})
>>>>       AND other.birth_year < (me.birth_year + {age_difference_range})
>>>>
>>>> here is the relevant profile portion:
>>>> Filter
>>>>   pred="(((Property(other,birth_year(66)) > 
>>>> Subtract(Property(me,birth_year(66)),Literal(10))
>>>> AND Property(other,birth_year(66)) < 
>>>> Add(Property(me,birth_year(66)),Literal(10)))
>>>> AND Property(sv,cached_available(71)) == Literal(1)) AND
>>>> hasLabel(sv:StyleVariant(13)))",
>>>>   _rows=47,
>>>>   _db_hits=4860
>>>>
>>>>
>>>>
>>>> On Tuesday, January 21, 2014 11:11:57 AM UTC-6, Michael Hunger wrote:
>>>>>
>>>>> The problem is cross-path expressions, which are not yet handled in
>>>>> that manner
>>>>>
>>>>> for simple expressions that only contain a single piece of the path
>>>>> (node, rel) and things that have been evaluated before (parameters,
>>>>> literals, previous computations) WILL be used to shortcut the path
>>>>> evaluation.
>>>>>
>>>>> but if you do: n1--n2--n3
>>>>>
>>>>> and then WHERE n2.foo > n1.bar it will be only applied AFTER the path
>>>>>
>>>>> if you do: WHERE n1.foo > 10 it will be applied DURING the path
>>>>> traversal
>>>>>
>>>>> HTH
>>>>>
>>>>> Michael
>>>>>
>>>>> Am 21.01.2014 um 18:08 schrieb Javad Karabi <karab...@gmail.com>:
>>>>>
>>>>> You will notice:
>>>>> "WHERE (Property(NodeIdentifier(),cached_available(71)) ==
>>>>> Literal(1)" in the TraversalMatcher() portion, the very first function of
>>>>> the profile..
>>>>>
>>>>> I believe that this is what is meant when the documentation says that
>>>>> the WHERE clause is not done after, (therefore during) the matching 
>>>>> process.
>>>>>
>>>>> However, you will also notice that immediately following that
>>>>> function, is Filter(), which is then filtering based on the ">" and "<"
>>>>> predicates of the query.
>>>>>
>>>>> obviously, the best case scenario would be if the ">" and "<" tests
>>>>> occurred inside TraversalMatcher(), i think
>>>>>
>>>>> On Tuesday, January 21, 2014 11:06:06 AM UTC-6, Javad Karabi wrote:
>>>>>>
>>>>>> Mark, I have emailed you the query and profile for both cases.
>>>>>>
>>>>>> On Tuesday, January 21, 2014 10:55:03 AM UTC-6, Javad Karabi wrote:
>>>>>>>
>>>>>>> Mark, I would be happy to. Give me a moment and I will post them.
>>>>>>>
>>>>>>> Michael,
>>>>>>>
>>>>>>>    - Kernel version
>>>>>>>
>>>>>>>    neo4j-browser, version: 2.0.0
>>>>>>>    -
>>>>>>>
>>>>>>>
>>>>>>> On Tuesday, January 21, 2014 10:49:37 AM UTC-6, Michael Hunger wrote:
>>>>>>>>
>>>>>>>> Java, what version are you using?
>>>>>>>>
>>>>>>>> 2.0 final?
>>>>>>>>
>>>>>>>> Michael
>>>>>>>>
>>>>>>>> Am 21.01.2014 um 17:29 schrieb Javad Karabi <karab...@gmail.com>:
>>>>>>>>
>>>>>>>> from what I can tell, if there where clause is ">" or "<" (as it is
>>>>>>>> in the actual query which i am using, not in this example query...) 
>>>>>>>> then
>>>>>>>> the WHERE predicate _is in fact_ a filter, applied _after_ the match. 
>>>>>>>> It
>>>>>>>> looks to me that "TraversalMatcher()" does not apply predicates which
>>>>>>>> involve > or <, but instead delegates this to "Filter()" after the 
>>>>>>>> fact,
>>>>>>>> which does not correlate with what is stated on the documentation.
>>>>>>>>
>>>>>>>> On Tuesday, January 21, 2014 10:25:41 AM UTC-6, Javad Karabi wrote:
>>>>>>>>>
>>>>>>>>> (c:Customer)-[:ordered]->(p:Product)-[:category]->(:Category)
>>>>>>>>>
>>>>>>>>> Now, say that there are 2:
>>>>>>>>> c-[:ordered]->(:Product { name: "pants", quantity: 10})
>>>>>>>>> c-[:ordered]->(:Product { name: "shirt",   quantity: 5})
>>>>>>>>>
>>>>>>>>> Now, say that if I only want to cross the category relationship if
>>>>>>>>> the p.quantity > 6
>>>>>>>>>
>>>>>>>>> In the most basic way, I would do:
>>>>>>>>>
>>>>>>>>> (c:Customer)-[:ordered]->(p:Product)-[:category]->(cat:Category)
>>>>>>>>> WHERE p.quantity > 6
>>>>>>>>>
>>>>>>>>> However, I figured that maybe neo4j would (non-optimally) traverse
>>>>>>>>> the entire path _then_ filter where on top of the path.
>>>>>>>>>
>>>>>>>>> So what I did was:
>>>>>>>>>
>>>>>>>>> MATCH (c:Customer)-[:ordered]->(p:Product)
>>>>>>>>> WHERE p.quantity > 6
>>>>>>>>> WITH p
>>>>>>>>> MATCH p-[:category]->(cat:Category)
>>>>>>>>>
>>>>>>>>> This, I figured, would then allow neo4j to cross out to all the
>>>>>>>>> product nodes, as I would need them anyway in order to filter out the 
>>>>>>>>> ones
>>>>>>>>> which have a quantity of less than 6.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Now... finally to my question.
>>>>>>>>> The following URL:
>>>>>>>>> http://docs.neo4j.org/chunked/stable/query-match.html
>>>>>>>>> states that:
>>>>>>>>> WHERE defines the MATCH patterns in more detail. The predicates
>>>>>>>>> are part of the pattern description, not a filter applied after the
>>>>>>>>> matching is done.
>>>>>>>>>
>>>>>>>>> So, my question is, if the predicates (specifically p.quantity >
>>>>>>>>> 6) are part of the pattern description, and _not_ applied _after_ 
>>>>>>>>> matching
>>>>>>>>> (therefore applied before or during), then cutting the query with the 
>>>>>>>>> WITHs
>>>>>>>>> would be a moot point
>>>>>>>>>
>>>>>>>>> So, I would think that
>>>>>>>>>
>>>>>>>>> (c:Customer)-[:ordered]->(p:Product)-[:category]->(cat:Category)
>>>>>>>>> WHERE p.quantity > 6
>>>>>>>>> would be sufficient, , as neo4j _would not_ actually traverse to
>>>>>>>>> cat, since it would apply the filter during the match process.
>>>>>>>>>
>>>>>>>>> However, in practice, I notice that using WITH is actually faster.
>>>>>>>>> Is there any possible reason for this?
>>>>>>>>> It may be necessary for me to show my query exactly, I also have
>>>>>>>>> the profile data for the query, which I am currently analyzing
>>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> 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 neo4j+un...@googlegroups.com.
>>>>>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>> --
>>>>> 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 neo4j+un...@googlegroups.com.
>>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>>
>>>>>
>>>>>
>>>> --
>>>> 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 neo4j+un...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>
>>>>
>>>>
>> --
>> 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 neo4j+unsubscr...@googlegroups.com.
>>
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "Neo4j" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/neo4j/sPUjrAoJwyY/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> neo4j+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>
> --
> 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 neo4j+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "Neo4j" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/neo4j/sPUjrAoJwyY/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> neo4j+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
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 neo4j+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to