Timeout in dbpedia sparql query. Trying with multiple fields - timeout

I am using DBpedia SPARQL query to get the list of persons with details.
I have DBpedia dump data which is stored locally. When I query, virtuoso gets stop.
Query -
SELECT DISTINCT ?dbpedia_link ?freebase_link str(?abstract) as ?abstract str(?alias) as ?alias
str(?birthDate) as ?birthDate str(?birthName) as ?birthName str(?birthPlace) as ?birthPlace
str(?label) as ?label str(?occupation) as ?occupation str(?residence) as ?residence
str(?spouse) as ?spouse str(?education) as ?education str(?networth) as ?networth str(?salary) as ?salary
str(?wikiPageID) as ?wikiPageID str(?wikiPageRevisionID) as ?wikiPageRevisionID str(?shortDescription) as ?shortDescription
WHERE {
{
?dbpedia_link rdf:type dbpedia-owl:Person
}
OPTIONAL {?dbpedia_link dbpedia-owl:abstract ?abstract. }
OPTIONAL {?dbpedia_link dbpedia-owl:alias ?alias .}
OPTIONAL {?dbpedia_link dbpprop:birthDate ?birthDate .}
OPTIONAL {?dbpedia_link dbpprop:birthName ?birthName .}
OPTIONAL {?dbpedia_link dbpprop:birthPlace ?birthPlace .}
OPTIONAL {?dbpedia_link rdfs:label ?label .}
OPTIONAL {?dbpedia_link dbpprop:occupation ?occupation .}
OPTIONAL {?dbpedia_link dbpprop:residence ?residence .}
OPTIONAL {?dbpedia_link dbpprop:spouse ?spouse .}
OPTIONAL {?dbpedia_link dbpprop:education ?education .}
OPTIONAL {?dbpedia_link dbpprop:networth ?networth .}
OPTIONAL {?dbpedia_link dbpprop:salary ?salary .}
OPTIONAL {?dbpedia_link dbpedia-owl:wikiPageID ?wikiPageID .}
OPTIONAL {?dbpedia_link dbpedia-owl:wikiPageRevisionID ?wikiPageRevisionID .}
OPTIONAL {?dbpedia_link dbpprop:shortDescription ?shortDescription .}
OPTIONAL {?dbpedia_link owl:sameAs ?freebase_link
FILTER regex(?freebase_link, "^http://rdf.freebase.com") .}
}LIMIT "1"
OFFSET "225930"
Any help on this?

Thing 1 -- query edited for clarity, with a few syntax corrections.
SELECT DISTINCT ?dbpedia_link
?freebase_link
( str(?abstract) AS ?abstract )
( str(?alias) AS ?alias )
( str(?birthDate) AS ?birthDate )
( str(?birthName) AS ?birthName )
( str(?birthPlace) AS ?birthPlace )
( str(?label) AS ?label )
( str(?occupation) AS ?occupation )
( str(?residence) AS ?residence )
( str(?spouse) AS ?spouse )
( str(?education) AS ?education )
( str(?networth) AS ?networth )
( str(?salary) AS ?salary )
( str(?wikiPageID) AS ?wikiPageID )
( str(?wikiPageRevisionID) AS ?wikiPageRevisionID )
( str(?shortDescription) AS ?shortDescription )
WHERE {
{ ?dbpedia_link rdf:type dbpedia-owl:Person }
OPTIONAL { ?dbpedia_link dbpedia-owl:abstract ?abstract }
OPTIONAL { ?dbpedia_link dbpedia-owl:alias ?alias }
OPTIONAL { ?dbpedia_link dbpprop:birthDate ?birthDate }
OPTIONAL { ?dbpedia_link dbpprop:birthName ?birthName }
OPTIONAL { ?dbpedia_link dbpprop:birthPlace ?birthPlace }
OPTIONAL { ?dbpedia_link rdfs:label ?label }
OPTIONAL { ?dbpedia_link dbpprop:occupation ?occupation }
OPTIONAL { ?dbpedia_link dbpprop:residence ?residence }
OPTIONAL { ?dbpedia_link dbpprop:spouse ?spouse }
OPTIONAL { ?dbpedia_link dbpprop:education ?education }
OPTIONAL { ?dbpedia_link dbpprop:networth ?networth }
OPTIONAL { ?dbpedia_link dbpprop:salary ?salary }
OPTIONAL { ?dbpedia_link dbpedia-owl:wikiPageID ?wikiPageID }
OPTIONAL { ?dbpedia_link dbpedia-owl:wikiPageRevisionID ?wikiPageRevisionID }
OPTIONAL { ?dbpedia_link dbpprop:shortDescription ?shortDescription }
OPTIONAL { ?dbpedia_link owl:sameAs ?freebase_link
FILTER regex( ?freebase_link, "^http://rdf.freebase.com" ) }
}
LIMIT 1
OFFSET 225930
Thing 2 -- you've got undefined prefixes in there. dbpedia-owl? dbpprop?
Random tinkering and asking random people on the web for help may get you some results, but you're likely to get faster, more accurate, more relevant answers about specific products and tools by asking on forums dedicated to those products and tools, e.g., the DBpedia discussion mailing list, the Virtuoso Users mailing list, etc.

Related

Can't paste long cypher text on Neo4j Browser

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

Cypher multiple OPTIONAL MATCH - Pattern Comprehension - COUNT DISTINCT

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

dart: unnecessary_null_comparision

For the following code:
bool assertTest(int? n1, int? n2) {
return (n1 == null) || (n1 != null && n2 != null);
}
there is a warning at n1 != null saying The operand can't be null, so the condition is always true.
Why does this warning show up? n1 is obviously nullable.
The boolean operation are lazy, it means that if you evaluate a || b and a is true, then b is not even evaluated.
In your case, if b = (n1 != null && n2 != null) is evaluated, it means a = (n1 == null) = false, which means n1 != null so the check n1 != null will always be true.

Dafny How could I write a predicate to prove a string is sorted by 'b' => 'a' => 'd'?

Could somebody please help me out in writing a Dafny predicate that checks if a string is sorted in the order 'b' -> 'a' -> 'd'
i.e:
"bbbaaaaad" == true
"abd" == false
"bad" == true
The predicate should have the following form:
predicate sortedbad(s:string)
{
[???]
}
Thanks
Here is one way to do it.
predicate bad_compare(c1:char, c2:char) {
c1 == 'b' || (c1 == 'a' && c2 != 'b') || c2 == 'd'
}
predicate sortedbad(s:string)
{
forall i, j | 0 <= i <= j < |s| :: bad_compare(s[i], s[j])
}
lemma Test()
{
assert sortedbad("bbbbaaaadddd");
var s := "bbbbbbda";
assert !bad_compare(s[6], s[7]);
assert !sortedbad(s);
}

Timeout error in SPARQL Dbpedia query, more fields are in used?

I am using Dbpedia sparql and trying to retrieve list of persons with details.
SPARQL Query (Not working):
SELECT DISTINCT ?dbpedia_link ?freebase_link str(?abstract) as ?abstract str(?activeYearsStartYear) as ?activeYearsStartYear str(?alias) as ?alias
str(?birthDate) as ?birthDate str(?birthName) as ?birthName str(?birthPlace) as ?birthPlace str(?children) as ?children
str(?label) as ?label str(?occupation) as ?occupation str(?otherNames) as ?otherNames str(?residence) as ?residence
str(?shortDescription) as ?shortDescription str(?spouse) as ?spouse str(?description) as ?description str(?subject) as ?subject
str(?comment) as ?comment str(?almaMater) as ?almaMater str(?award) as ?award str(?education) as ?education str(?knownFor) as ?knownFor
str(?networth) as ?networth str(?parents) as ?parents str(?salary) as ?salary str(?viafId) as ?viafId str(?wikiPageID) as ?wikiPageID
str(?wikiPageRevisionID) as ?wikiPageRevisionID WHERE {
{
?dbpedia_link rdf:type dbpedia-owl:Person
}
OPTIONAL {?dbpedia_link dbpedia-owl:abstract ?abstract. }
OPTIONAL {?dbpedia_link dbpedia-owl:activeYearsStartYear ?activeYearsStartYear .}
OPTIONAL {?dbpedia_link dbpedia-owl:alias ?alias .}
OPTIONAL {?dbpedia_link dbpprop:birthDate ?birthDate .}
OPTIONAL {?dbpedia_link dbpprop:birthName ?birthName .}
OPTIONAL {?dbpedia_link dbpprop:birthPlace ?birthPlace .}
OPTIONAL {?dbpedia_link dbpprop:children ?children .}
OPTIONAL {?dbpedia_link rdfs:label ?label .}
OPTIONAL {?dbpedia_link dbpprop:occupation ?occupation .}
OPTIONAL {?dbpedia_link dbpprop:otherNames ?otherNames .}
OPTIONAL {?dbpedia_link dbpprop:residence ?residence .}
OPTIONAL {?dbpedia_link dbpprop:shortDescription ?shortDescription .}
OPTIONAL {?dbpedia_link dbpprop:spouse ?spouse .}
OPTIONAL {?dbpedia_link dc:description ?description .}
OPTIONAL {?dbpedia_link dcterms:subject ?subject .}
OPTIONAL {?dbpedia_link rdfs:comment ?comment .}
OPTIONAL {?dbpedia_link dbpprop:almaMater ?almaMater .}
OPTIONAL {?dbpedia_link dbpprop:awards ?award .}
OPTIONAL {?dbpedia_link dbpprop:education ?education .}
OPTIONAL {?dbpedia_link dbpprop:knownFor ?knownFor .}
OPTIONAL {?dbpedia_link dbpprop:networth ?networth .}
OPTIONAL {?dbpedia_link dbpprop:parents ?parents .}
OPTIONAL {?dbpedia_link dbpprop:salary ?salary .}
OPTIONAL {?dbpedia_link dbpedia-owl:viafId ?viafId .}
OPTIONAL {?dbpedia_link dbpedia-owl:wikiPageID ?wikiPageID .}
OPTIONAL {?dbpedia_link dbpedia-owl:wikiPageRevisionID ?wikiPageRevisionID .}
OPTIONAL {?dbpedia_link owl:sameAs ?freebase_link
FILTER regex(?freebase_link, "^http://rdf.freebase.com") .}
OPTIONAL {?dbpedia_link dcterms:subject ?sub .}
}LIMIT 2 Offset 5
I have set the limit to 2 and offset to 5. It gives timeout error. Don't know why?
But when I removed half of fields + OPTIONAL statement from query then it give results. And works fine
SPARQL query (working):
SELECT DISTINCT ?dbpedia_link str(?abstract) as ?abstract str(?activeYearsStartYear) as ?activeYearsStartYear str(?alias) as ?alias
str(?birthDate) as ?birthDate str(?birthName) as ?birthName str(?birthPlace) as ?birthPlace str(?children) as ?children
str(?label) as ?label str(?occupation) as ?occupation str(?otherNames) as ?otherNames str(?residence) as ?residence
WHERE {
{
?dbpedia_link rdf:type dbpedia-owl:Person
}
OPTIONAL {?dbpedia_link dbpedia-owl:abstract ?abstract. }
OPTIONAL {?dbpedia_link dbpedia-owl:activeYearsStartYear ?activeYearsStartYear .}
OPTIONAL {?dbpedia_link dbpedia-owl:alias ?alias .}
OPTIONAL {?dbpedia_link dbpprop:birthDate ?birthDate .}
OPTIONAL {?dbpedia_link dbpprop:birthName ?birthName .}
OPTIONAL {?dbpedia_link dbpprop:birthPlace ?birthPlace .}
OPTIONAL {?dbpedia_link dbpprop:children ?children .}
OPTIONAL {?dbpedia_link rdfs:label ?label .}
OPTIONAL {?dbpedia_link dbpprop:occupation ?occupation .}
OPTIONAL {?dbpedia_link dbpprop:otherNames ?otherNames .}
OPTIONAL {?dbpedia_link dbpprop:residence ?residence .}
}LIMIT 2 offset 5
But don't know why it is not working with all fields.
Is there any limitation of fields in Dbpedia SPARQL?
it's both, a limitation and a feature...
If you run your first query on http://dbpedia.org/sparql and read the reply it should say
Virtuoso 42000 Error The estimated execution time 4626142 (sec) exceeds the limit of 240 (sec).
This essentially tells you that your query is pretty complex. The query planner estimated that it would need 4626142 seconds (~54 days) to run your query. As DBpedia is a free best effort service, they don't run such queries to be able to provide a good service for as many people as possible.
As you realized, your query gets a lot less complicated by providing less OPTIONAL clauses.
You might be unaware of the fact that you're asking for a cross-join (cartesian product) of all the fulfilling values for variables in all optional clauses. There are a lot less value combinations if you bind less variables.
If you're just interested in one value per variable you might want to have a look at the SAMPLE keyword.
With that many variables, all of which are optional, it seems like you're already going to need to do some post processing of the results. As such, I'd suggest that you actually just start asking for persons, and for any property that's in that list of properties, via values. E.g.:
select distinct ?s ?p ?o {
values ?p { dbpedia-owl:abstract
dbpedia-owl:abstract
dbpedia-owl:activeYearsStartYear
dbpedia-owl:alias
dbpprop:birthDate
dbpprop:birthName
dbpprop:birthPlace
dbpprop:children
rdfs:label
dbpprop:occupation
dbpprop:otherNames
dbpprop:residence }
?s a dbpedia-owl:Person ; ?p ?o .
}
order by ?s ?p
limit 100
offset 50
SPARQL results
That has a lot more rows, since it's got one per property, but it doesn't timeout. By ordering by ?s and then by ?p, the rows end up grouped by person, and with the properties in predictable order, so post processing shouldn't be all that hard. In fact, you could even use optional here, so that you'd always have the same number of rows per person, which would make it very easy (but I haven't tested this):
select ?s ?p ?o {
values ?p { #-- ...
}
?s a dbpedia-owl:Person .
optional { ?s ?p ?o }
}
order by ?s ?p

Resources