I use Neo4j the below.
Neo4j Browser version: 4.0.8
Neo4j Server version: 3.5.18 (community)
Since about half a year ago, I can't paste long cypher text on Neo4j Browser.
I can paste it per 10 lines in several batches. But I'm going crazy.
I was able to paste long cypher text about half a year ago.
I'm at a loss for finding a solution.
A sample of long cypher text is the following(syntactically correct).
MATCH(a0:C_Patent) WHERE a0._SID IN ['the_id']
CALL apoc.cypher.run('WITH {a0} AS a0 OPTIONAL MATCH(b2:C_Country) WHERE a0.Country = b2.Name
OPTIONAL MATCH(b2:C_Country) RETURN b2._SID AS _SID, LABELS(b2)[0] AS module, b2.Name AS Name, b2.CountryName AS CountryName', {a0:a0}) YIELD value AS b2
WITH DISTINCT a0, {_SID:b2._SID, module:b2.module, Name:b2.Name, CountryName:b2.CountryName} AS Country
CALL apoc.cypher.run('WITH {a0} AS a0 OPTIONAL MATCH(c2:C_Employee) WHERE a0.LastModifiedUser = c2.Name
OPTIONAL MATCH(c2:C_Employee) RETURN c2._SID AS _SID, LABELS(c2)[0] AS module, c2.Name AS Name, c2.Fullname AS Fullname', {a0:a0}) YIELD value AS c2
WITH DISTINCT a0, Country, {_SID:c2._SID, module:c2.module, Name:c2.Name, Fullname:c2.Fullname} AS LastModifiedUser
OPTIONAL MATCH(a0:C_Patent)-[d0:RDAVAILABLE]->(e0:C_RDDivision)
WITH DISTINCT a0, Country, LastModifiedUser, {_SID:e0._SID, module:LABELS(e0)[0], _RID:d0._RID, Name:e0.Name, Fullname:e0.Fullname, Name:e0.Name} AS RDDivision ORDER BY RDDivision.Name
OPTIONAL MATCH(a0:C_Patent)-[f0:ATTACHMENT]->(g0:C_Document) WHERE g0.Type = '1'
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, {_SID:g0._SID, module:LABELS(g0)[0], _RID:f0._RID, Name:g0.Name, Date:g0.Date, Time:g0.Time} AS PrincipalFigure ORDER BY PrincipalFigure.Date ASC, PrincipalFigure.Time ASC
OPTIONAL MATCH(a0:C_Patent)-[h0:APPLICANT]->(i0) WHERE (i0:C_Company OR i0:C_Party OR i0:C_Person OR i0:C_Practitioner)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, {_SID:i0._SID, module:LABELS(i0)[0], _RID:h0._RID, RightShare:h0.RightShare, CostShare:h0.CostShare, ApplicantReference:h0.ApplicantReference, Type:h0.Type, ApplicantMemo:h0.ApplicantMemo, Order:h0.Order, Name:i0.Name, Fullname:i0.Fullname, Order:h0.Order} AS Applicants ORDER BY Applicants.Order ASC
OPTIONAL MATCH(a0:C_Patent)-[j0:REPRESENTOR]->(k0) WHERE (k0:C_Company OR k0:C_Party)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, {_SID:k0._SID, module:LABELS(k0)[0], _RID:j0._RID, ApplicantReference:j0.ApplicantReference, ApplicantMemo:j0.ApplicantMemo, Order:j0.Order, Name:k0.Name, Fullname:k0.Fullname, Order:j0.Order} AS Representor ORDER BY Representor.Order ASC
CALL apoc.path.spanningTree(a0, {relationshipFilter: 'ORIGINAL|PRIORITY|REGIONAL', labelFilter: '+C_Design|C_Gazette|C_Patent', minLevel: 0, maxLevel: 999}) YIELD path
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, NODES(path) AS _nodes UNWIND _nodes AS _node
OPTIONAL MATCH(_node)-[r:ORIGINAL|PRIORITY|REGIONAL]-(dst)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, _node, r, dst, _node=STARTNODE(r) AS outgoing ORDER BY _node.Name
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, _node, CASE WHEN outgoing THEN { type:TYPE(r), _SID:dst._SID } END AS parents
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, _node {._SID, `#parents`:COLLECT(parents), .Name, ._SID, .Status, .Country, .Law, .AppType, .AppRoute, .AppNumber, .AppDate, .PubNumber, .RegNumber, .RegDate, module:LABELS(_node)[0]} AS LegalFamily
OPTIONAL MATCH(a0:C_Patent)-[t0:AGENT]->(u0) WHERE (u0:C_Employee OR u0:C_Party OR u0:C_Person OR u0:C_Practitioner)
OPTIONAL MATCH(u0)-[v0:COMPANY]->(w0) WHERE (w0:C_Company OR w0:C_Party OR w0:C_Practitioner)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, {_SID:u0._SID, module:LABELS(u0)[0], _RID:t0._RID, Type:t0.Type, AgentMemo:t0.AgentMemo, Order:t0.Order, Name:u0.Name, Fullname:u0.Fullname, ComName:w0.Fullname, Order:t0.Order} AS Practitioners ORDER BY Practitioners.Order ASC
OPTIONAL MATCH(a0:C_Patent)-[x0:IPREP]->(y0:C_Employee)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, {`#IPRepFullname`:y0.Fullname, Name:y0.Name} AS y0_Pack ORDER BY y0_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[z0:REPCONTACT]->(a1:C_Employee)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, {`#ContactFullname`:a1.Fullname, Name:a1.Name} AS a1_Pack ORDER BY a1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[b1:INVENTOR]->(c1) WHERE (c1:C_Employee OR c1:C_Person) AND b1.Order = 1
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, {`#RepInventorFullname`:c1.Fullname, Name:c1.Name} AS c1_Pack ORDER BY c1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[d1:RIGHTSHARE]->(e1:C_Office)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, {`#RightDivisionFullnames`:e1.Fullname, _SID:e1._SID, Order:d1.Order} AS e1_Pack ORDER BY e1_Pack.Order ASC
OPTIONAL MATCH(a0:C_Patent)-[f1:COSTSHARE]->(g1:C_CostShare)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, {`#CostDivisionFullnames`:g1.Fullname, _SID:g1._SID, Order:f1.Order} AS g1_Pack ORDER BY g1_Pack.Order ASC
OPTIONAL MATCH(a0:C_Patent)<-[h1:APPLICATION]-(i1:C_PatFamily)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, {`#FamilyNo`:i1.Name, Name:i1.Name} AS i1_Pack ORDER BY i1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[j1:ORIGINAL|PRIORITY|REGIONAL*0..]->(k1)-[l1:PRIORITY]->(m1) WHERE (k1:C_Gazette OR k1:C_Patent) AND (m1:C_Gazette OR m1:C_Patent) AND NOT (m1)-[:PRIORITY]->()
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack
, MIN({AppDate:m1.AppDate, Name:m1.Name}) AS _min
OPTIONAL MATCH(a0:C_Patent)-[j1:ORIGINAL|PRIORITY|REGIONAL*0..]->(k1)-[l1:PRIORITY]->(m1)
WHERE NOT (m1)-[:PRIORITY]->() AND _min.AppDate = m1.AppDate AND _min.Name = m1.Name
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, {`#EarliestPriorityClaimAppDate`:m1.AppDate, Name:k1.Name} AS m1_Pack ORDER BY m1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[n1:ORIGINAL*0..]->(o1)-[p1:ORIGINAL]->(q1) WHERE (o1:C_Design OR o1:C_Gazette OR o1:C_Patent) AND (q1:C_Design OR q1:C_Gazette OR q1:C_Patent) AND NOT (q1)-[:ORIGINAL]->()
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, m1_Pack
, MIN({AppDate:q1.AppDate, Name:q1.Name}) AS _min
OPTIONAL MATCH(a0:C_Patent)-[n1:ORIGINAL*0..]->(o1)-[p1:ORIGINAL]->(q1)
WHERE NOT (q1)-[:ORIGINAL]->() AND _min.AppDate = q1.AppDate AND _min.Name = q1.Name
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, m1_Pack, {`#EarliestParentAppDate`:q1.AppDate, Name:o1.Name} AS q1_Pack ORDER BY q1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[r1:APPOFFICE]->(s1) WHERE (s1:C_Company OR s1:C_Party OR s1:C_Practitioner)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, m1_Pack, q1_Pack, {`#SupplierFullname`:s1.Fullname, Name:s1.Name} AS s1_Pack ORDER BY s1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[t1:ASSOCIATOR]->(u1:C_Practitioner)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, m1_Pack, q1_Pack, s1_Pack, {`#AssociatorFullname`:u1.Fullname, Name:u1.Name} AS u1_Pack ORDER BY u1_Pack.Name
OPTIONAL MATCH(a0:C_Patent)-[v1:AVAILABLE]->(w1:C_Product)
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, m1_Pack, q1_Pack, s1_Pack, u1_Pack, {`#ProductFullnames`:w1.Fullname, _SID:w1._SID, Order:v1.Order} AS w1_Pack ORDER BY w1_Pack.Order ASC
OPTIONAL MATCH(a0:C_Patent)-[x1:PRIORITY|REGIONAL*0..]->(y1)-[z1:REGIONAL]->(a2) WHERE (y1:C_Gazette OR y1:C_Patent) AND (a2:C_Gazette OR a2:C_Patent) AND (a0.Country = 'WO' OR a2.Country = 'WO')
WITH DISTINCT a0, Country, LastModifiedUser, RDDivision, PrincipalFigure, Applicants, Representor, Inventors, LegalFamily, Practitioners, y0_Pack, a1_Pack, c1_Pack, e1_Pack, g1_Pack, i1_Pack, m1_Pack, q1_Pack, s1_Pack, u1_Pack, w1_Pack, {`#IntlAppDate`:CASE WHEN a0.Country = 'WO' THEN a0.AppDate ELSE a2.AppDate END, `#IntlPubDate`:CASE WHEN a0.Country = 'WO' THEN a0.PubDate ELSE a2.PubDate END, Name:y1.Name} AS a2_Pack ORDER BY a2_Pack.Name
RETURN labels(a0)[0] AS label, a0{_SID:a0._SID, module:labels(a0)[0], public:1
, _SID:a0._SID
, Name:a0.Name
, Status:a0.Status
, AppNumber:a0.AppNumber
, InventionTitle:a0.InventionTitle
, Contracted:a0.Contracted
, NEDOContracted:a0.NEDOContracted
, Finally:a0.Finally
, Nickname:a0.Nickname
, AppDate:a0.AppDate
, PubNumber:a0.PubNumber
, PubDate:a0.PubDate
, ExamRequestDeadline:a0.ExamRequestDeadline
, NextAnnuityDueDate:a0.NextAnnuityDueDate
, RegNumber:a0.RegNumber
, RegDate:a0.RegDate
, FinallyDate:a0.FinallyDate
, TermRemainingDays:duration.inDays(date(), date(toString(a0.PatentTermLapseDate))).days
, SupplierAssignedID:a0.SupplierAssignedID
, Evaluation:a0.Evaluation
, Rank:a0.Rank
, IPContactClass:a0.IPContactClass
, IssueMemo:a0.IssueMemo
, ExpenseMemo:a0.ExpenseMemo
, ApplicationTitle:a0.ApplicationTitle
, ClaimCount:a0.ClaimCount
, ClaimCountInApp:a0.ClaimCountInApp
, AppReference:a0.AppReference
, Abstract:a0.Abstract
, Claims:a0.Claims
, IPC:a0.IPC
, ApplicationNote:a0.ApplicationNote
, AppKeyword:a0.AppKeyword
, FreeKeyward:a0.FreeKeyward
, ApplicationMemo:a0.ApplicationMemo
, ResearchDevelopmentDivision:a0.ResearchDevelopmentDivision
, ResearchDevelopmentDivisionText:a0.ResearchDevelopmentDivisionText
, ResearchDevelopmentDivision_SDK:a0.ResearchDevelopmentDivision_SDK
, ResearchDevelopmentDivisionText_SDK:a0.ResearchDevelopmentDivisionText_SDK
, m_FamilyNo:a0.m_FamilyNo
, m_OrgName:a0.m_OrgName
, OrgCompany:a0.OrgCompany
, m_Knowhow:a0.m_Knowhow
, LastModifiedTime:a0.LastModifiedTime
, CreatedTime:a0.CreatedTime
, Law:a0.Law
, AppRoute:a0.AppRoute
, Country:COLLECT(Country)[0]
, LastModifiedUser:COLLECT(LastModifiedUser)[0]
, RDDivision:CASE WHEN RDDivision._SID IS NULL THEN NULL ELSE COLLECT(DISTINCT RDDivision)[0] END
, PrincipalFigure:CASE WHEN PrincipalFigure._SID IS NULL THEN NULL ELSE COLLECT(DISTINCT PrincipalFigure)[0] END
, Applicants:CASE WHEN Applicants._SID IS NULL THEN [] ELSE COLLECT(DISTINCT Applicants) END
, Representor:CASE WHEN Representor._SID IS NULL THEN [] ELSE COLLECT(DISTINCT Representor) END
, Inventors:CASE WHEN Inventors._SID IS NULL THEN [] ELSE COLLECT(DISTINCT Inventors) END
, LegalFamily:CASE WHEN LegalFamily._SID IS NULL THEN [] ELSE COLLECT(DISTINCT LegalFamily) END
, Practitioners:CASE WHEN Practitioners._SID IS NULL THEN [] ELSE COLLECT(DISTINCT Practitioners) END
, IPRepFullname:COLLECT(DISTINCT y0_Pack.`#IPRepFullname`)
, ContactFullname:COLLECT(DISTINCT a1_Pack.`#ContactFullname`)
, RepInventorFullname:COLLECT(DISTINCT c1_Pack.`#RepInventorFullname`)
, RightDivisionFullnames:REDUCE(a=[], x IN COLLECT(DISTINCT {_SID:e1_Pack._SID, `#RightDivisionFullnames`:e1_Pack.`#RightDivisionFullnames`}) | a + COALESCE(x.`#RightDivisionFullnames`, 'null'))
, CostDivisionFullnames:REDUCE(a=[], x IN COLLECT(DISTINCT {_SID:g1_Pack._SID, `#CostDivisionFullnames`:g1_Pack.`#CostDivisionFullnames`}) | a + COALESCE(x.`#CostDivisionFullnames`, 'null'))
, FamilyNo:COLLECT(DISTINCT i1_Pack.`#FamilyNo`)
, EarliestPriorityClaimAppDate:COLLECT(DISTINCT m1_Pack.`#EarliestPriorityClaimAppDate`)
, EarliestParentAppDate:COLLECT(DISTINCT q1_Pack.`#EarliestParentAppDate`)
, SupplierFullname:COLLECT(DISTINCT s1_Pack.`#SupplierFullname`)
, AssociatorFullname:COLLECT(DISTINCT u1_Pack.`#AssociatorFullname`)
, ProductFullnames:REDUCE(a=[], x IN COLLECT(DISTINCT {_SID:w1_Pack._SID, `#ProductFullnames`:w1_Pack.`#ProductFullnames`}) | a + COALESCE(x.`#ProductFullnames`, 'null'))
, IntlAppDate:COLLECT(DISTINCT a2_Pack.`#IntlAppDate`)
, IntlPubDate:COLLECT(DISTINCT a2_Pack.`#IntlPubDate`)
} AS nodes ORDER BY nodes.Name DESC;
Maybe try out the centrally hosted browser and see if the latest versions sorts things out for you. FWIW, I couldn't replicate the issue on the latest version of Browser (5.3.0)
http://browser.graphapp.io
I have read a lot of comments about OPTIONAL MATCH and Pattern Comprehesion, but I can't find a solution for my case.
I have a node (Account) in my Neo4j Database and I'd like to count the nodes which belongs to each account.
The following code works with one or two optional matches, but the many optional matches produce a cross product and a timeout.
// Account
MATCH (a:Account{billingCountry: "DE", isDeleted: false})
WHERE a.id IS NOT NULL
// User
MATCH (a)<-[:CREATED]-(u:User)
// Contact
OPTIONAL MATCH (a) <-[:CONTACT_OF]- (c:Contact{isDeleted: false})
// Opportunity
OPTIONAL MATCH (a) <-[:OPPORTUNITY_OF]- (o:Opportunity{isDeleted: false, s4sMarked_For_Deletion__C: false})
// Open Opportunity
OPTIONAL MATCH (a)<-[:OPPORTUNITY_OF]-(open:Opportunity{isClosed: false, isDeleted: false})
// Attribute
OPTIONAL MATCH (a) <-[:ATTRIBUTE_OF]- (aa:Attribute_Assignment{isDeleted: false})
// Sales Planning
OPTIONAL MATCH (a) <-[:SALESPLAN_OF]- (s:Sales_Planning)
// Task
OPTIONAL MATCH (a) <-[:TASK_OF]- (t:Task{isDeleted: false})
// Event
OPTIONAL MATCH (a) <-[:EVENT_OF]- (e:Event{isDeleted: false})
// Contract
OPTIONAL MATCH (a) <-[:CONTRACT_OF]- (ct:Contract{isDeleted: false})
RETURN
a.id
u.name AS User_Name,
u.department AS User_Department,
COUNT(DISTINCT c.id) AS Contact_Count,
COUNT(DISTINCT o.id) AS Opportunity_Count,
COUNT(DISTINCT open.id) AS OpenOpp_Count,
COUNT(DISTINCT aa.id) AS Attribute_Count,
COUNT(DISTINCT s.timeYear) AS Sales_Plan_Count,
COUNT(DISTINCT t.id) AS Task_Count,
COUNT(DISTINCT e.id) AS Event_Count,
COUNT(DISTINCT ct.id) AS Contract_Count
I can rewrite the query with a Pattern Compression, but then I just get back the non distinct ids in arrays.
Is there a way to count the distinct values inside the arrays or another way how to count the values in pattern compression?
MATCH (a:Account{billingCountry: "DE", isDeleted: false})
WHERE a.id IS NOT NULL
RETURN a.id,
[
[(a)<-[:CONTACT_OF]- (c:Contact{isDeleted: false}) | c.id],
[(a)<-[:OPPORTUNITY_OF]- (o:Opportunity{isDeleted: false, s4sMarked_For_Deletion__C: false}) | o.id],
[(a)<-[:OPPORTUNITY_OF]-(open:Opportunity{isClosed: false, isDeleted: false}) | open.id],
[(a) <-[:ATTRIBUTE_OF]- (aa:Attribute_Assignment{isDeleted: false}) | aa.id],
[(a) <-[:SALESPLAN_OF]- (s:Sales_Planning) | s.timeYear],
[(a) <-[:TASK_OF]- (t:Task{isDeleted: false}) | t.id],
[(a) <-[:EVENT_OF]- (e:Event{isDeleted: false}) | e.id],
[(a) <-[:CONTRACT_OF]- (ct:Contract{isDeleted: false}) | ct.id]
]
If I made a formal mistake in my first stockoverflow post, I would appreciate feedback :)
The problem lies, in the RETURN statement, because you are calculating all the counts at the last, neo4j has to calculate the cartesian products. If you calculate each node count at each step, it will be much more optimal. Like this:
MATCH (a:Account{billingCountry: "DE", isDeleted: false})
WHERE a.id IS NOT NULL
MATCH (a)<-[:CREATED]-(u:User)
OPTIONAL MATCH (a) <-[:CONTACT_OF]- (c:Contact{isDeleted: false})
WITH a, u, COUNT(DISTINCT c.id) AS Contact_Count,
OPTIONAL MATCH (a) <-[:OPPORTUNITY_OF]- (o:Opportunity{isDeleted: false, s4sMarked_For_Deletion__C: false})
WITH a, u, Contact_Count, COUNT(DISTINCT o.id) AS Opportunity_Count
OPTIONAL MATCH (a)<-[:OPPORTUNITY_OF]-(open:Opportunity{isClosed: false, isDeleted: false})
WITH a, u, Contact_Count, Opportunity_Count, COUNT(DISTINCT open.id) AS OpenOpp_Count
OPTIONAL MATCH (a) <-[:ATTRIBUTE_OF]- (aa:Attribute_Assignment{isDeleted: false})
WITH a, u, Contact_Count, Opportunity_Count, OpenOpp_Count, COUNT(DISTINCT aa.id) AS Attribute_Count
OPTIONAL MATCH (a) <-[:SALESPLAN_OF]- (s:Sales_Planning)
WITH a, u, Contact_Count, Opportunity_Count, OpenOpp_Count, Attribute_Count,COUNT(DISTINCT s.timeYear) AS Sales_Plan_Count
OPTIONAL MATCH (a) <-[:TASK_OF]- (t:Task{isDeleted: false})
WITH a, u, Contact_Count, Opportunity_Count, OpenOpp_Count, Attribute_Count, Sales_Plan_Count, COUNT(DISTINCT t.id) AS Task_Count
OPTIONAL MATCH (a) <-[:EVENT_OF]- (e:Event{isDeleted: false})
WITH a, u, Contact_Count, Opportunity_Count, OpenOpp_Count, Attribute_Count, Sales_Plan_Count, Task_Count, COUNT(DISTINCT e.id) AS Event_Count
OPTIONAL MATCH (a) <-[:CONTRACT_OF]- (ct:Contract{isDeleted: false})
RETURN
a.id, u.name AS User_Name, u.department AS User_Department, Contact_Count,
Opportunity_Count, OpenOpp_Count, Attribute_Count, Sales_Plan_Count,
Task_Count, Event_Count, COUNT(DISTINCT ct.id) AS Contract_Count