All your optional matches, what cardinality do they have? at most 1 or more?
If it is > 1 you should reduce the cardinality in between, e.g.
MATCH (n:DataModel:CI__DataModel) WHERE ( n.name='host' )
OPTIONAL MATCH(n)-[:PARENT]->(parentNode)
WITH n, collect(DISTINCT parentNode.__id__) as parentIds
...
otherwise each subsequent (optional) match has to be executed for all those
multiplied rows.
I don't think you need a distinct then if you do the aggregation directly
after each match.
Something else that might help is to rewrite the query to:
MATCH (n:DataModel:CI__DataModel) WHERE n.name={name}
OPTIONAL
MATCH(n)-[:PARENT|:DISPLAYATTRIBUTE|:CREATEDBY|:APPLICATIONACCESS|:UPDATEDBY|:APPLICATION]->(related)
WITH n, type(rel) as type, collect(related.__id__) as ids
RETURN n as data, collect({type:type, ids:ids}) as relatedIds
you should also use a parameter for 'host' -> {name}
On Sun, Jul 24, 2016 at 9:06 PM, Michael Hunger <
[email protected]> wrote:
> Can you run it with PROFILE instead of EXPLAIN ? So that the actual costs
> are visible not just the estimated ones?
>
> Please also share your current indexes/constraints (run "schema")
>
> Michael
>
> On Fri, Jul 22, 2016 at 1:09 AM, Matias Burak <[email protected]> wrote:
>
>> Hi all,
>>
>> Hi, I need some help with a slow query, tried on neo4j 2.5 and 3.0
>>
>>
>> MATCH (n:DataModel:CI__DataModel) WHERE ( n.name='host' )
>>
>> OPTIONAL MATCH(n)-[:PARENT]->(parentNode)
>>
>> OPTIONAL MATCH(n)-[:DISPLAYATTRIBUTE]->(displayAttributeNode)
>>
>> OPTIONAL MATCH(n)-[:CREATEDBY]->(createdByNode)
>>
>> OPTIONAL MATCH(n)-[:APPLICATIONACCESS]->(applicationAccessNode)
>>
>> OPTIONAL MATCH(n)-[:UPDATEDBY]->(updatedByNode)
>>
>> OPTIONAL MATCH(n)-[:APPLICATION]->(applicationNode) RETURN n as data
>>
>> , collect(DISTINCT applicationNode.__id__) as applicationIds,
>> collect(DISTINCT applicationAccessNode.__id__) as applicationAccessIds,
>> collect(DISTINCT createdByNode.__id__) as createdByIds, collect(DISTINCT
>> displayAttributeNode.__id__) as displayAttributeIds, collect(DISTINCT
>> parentNode.__id__) as parentIds, collect(DISTINCT updatedByNode.__id__) as
>> updatedByIds
>>
>>
>> It’s taking about 1 sec
>>
>> i cannot change much the query… if i remove the APPLICATIONACCESS and
>> UPDATEDBY relationships from that query, it goes very fast
>>
>>
>>
>> I see that it’s doing an AllNodeScan for them:
>>
>>
>> Compiler CYPHER 3.0
>>
>>
>> Planner COST
>>
>>
>> Runtime INTERPRETED
>>
>>
>>
>> +----------------------+----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | Operator | Estimated Rows | Variables
>> | Other
>>
>> |
>>
>>
>> +----------------------+----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +ProduceResults | 862472 | applicationAccessIds,
>> applicationIds, createdByIds, data, displayAttributeIds, parentIds, ...
>> | data, applicationIds, applicationAccessIds, createdByIds,
>> displayAttributeIds, parentIds, updatedByIds |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +EagerAggregation | 862472 | applicationAccessIds,
>> applicationIds, createdByIds, displayAttributeIds, parentIds, ...
>> | data
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +Projection | 743858355653 | data -- anon[120], anon[183],
>> anon[232], anon[297], anon[346], anon[77], applicationAccessNode, ... |
>> updatedByNode; createdByNode; n; displayAttributeNode;
>> applicationAccessNode; applicationNode; parentNode |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +NodeOuterHashJoin | 743858355653 | anon[120], anon[183],
>> anon[232], anon[297], anon[77], applicationAccessNode, createdByNode, ...
>> |
>> |
>>
>> | |\
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | | +Expand(All) | 101 | anon[346], applicationNode -- n
>> |
>> (n)-[:APPLICATION]->(applicationNode)
>> |
>>
>> | | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | | +AllNodesScan | 446872 | n
>> |
>>
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +NodeOuterHashJoin | 426134864 | anon[120], anon[183],
>> anon[232], anon[77], applicationAccessNode, createdByNode, ...
>> |
>> |
>>
>> | |\
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | | +Expand(All) | 2390 | anon[297], n -- updatedByNode
>> |
>> (updatedByNode)<-[:UPDATEDBY]-(n)
>> |
>>
>> | | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | | +AllNodesScan | 446872 | updatedByNode
>> |
>>
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +OptionalExpand(All) | 771541 | anon[232],
>> applicationAccessNode -- anon[120], anon[183], anon[77], createdByNode, ...
>> | (n)-[:APPLICATIONACCESS]->(applicationAccessNode)
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +OptionalExpand(All) | 442 | anon[183], createdByNode --
>> anon[120], anon[77], displayAttributeNode, n, parentNode |
>> (n)-[:CREATEDBY]->(createdByNode)
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +OptionalExpand(All) | 65 | anon[120], displayAttributeNode
>> -- anon[77], n, parentNode |
>> (n)-[:DISPLAYATTRIBUTE]->(displayAttributeNode)
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +OptionalExpand(All) | 0 | anon[77], parentNode -- n
>> |
>> (n)-[:PARENT]->(parentNode)
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +Filter | 0 | n
>> |
>> n.name == { AUTOSTRING0} AND n:CI__DataModel
>> |
>>
>> | |
>>
>> +----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>> | +NodeByLabelScan | 16 | n
>> |
>> :DataModel
>> |
>>
>>
>> +----------------------+----------------+-----------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
>>
>>
>> Total database accesses: ? |
>>
>> |
>>
>>
>>
>> Perhaps some indexes missing?
>>
>> I think they should all be indexed by __id__
>>
>>
>> Thanks,
>>
>> Matias.
>>
>> --
>> 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.
>>
>
>
--
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.