for purpose of comparison between SQL queries and cypher queries for my researches I have the same relational database (with 50.000 relationships) which I converted to neo4j database and I want to execute same queries for relational and graph database and then optimize execution time by replacing SQL queries by cypher ones my database has entityclasses where each two entityclasses are related by a relationshipclasse I want to execute join queries(in case of SQL) and cypher queries with optional match clause to get the same results in a relational database we can start selecting data from a relation table or a class table or a relation table in the case of neo4j corresponds to a relationship that's why i have two types of queries as follow :
CALL apoc.index.relationships('relationshipclazz0','att0:*') YIELD rel as R0 OPTIONAL MATCH (N:entityclazz0)<-[R0]-(N0:entityclazz1) OPTIONAL MATCH (N0:entityclazz1)-[R1:relationshipclazz0]-() WITH distinct R0, R0.att0 as AR0att0, count(R1.att1) as AR1att1, R1.att1 as BR1att1 ORDER BY AR1att1 desc,BR1att1,ID(R0), AR0att0 WITH ID(R0) as i, R0.att0 as O1, head(collect(BR1att1)) as O2, R0 RETURN O1, O2, count(i) ORDER BY O1, O2 the first query I started from a relationship the second query in which I started from a entityclazz node is as follow: CALL apoc.index.nodes('entityclazz1','att0:*') YIELD node as N0 OPTIONAL MATCH (N0)-[R0:relationshipclazz0]-() OPTIONAL MATCH (N0)-[R1:relationshipclazz0]-() OPTIONAL MATCH ()-[R2:relationshipclazz0]-(N3:entityclazz1) WITH distinct N0, N0.att0 as AN0att0, count(R0.att3) as AR0att3, R0.att3 as BR0att3, count(N3.att1) as AN3att1, N3.att1 as BN3att1 ORDER BY AN3att1 desc,BN3att1,AR0att3 desc,BR0att3,ID(N0), AN0att0 WITH ID(N0) as i, N0.att0 as O1, head(collect(BR0att3)) as O2, head(collect(BN3att1)) as O3, N0 RETURN O1, O2, O3, count(i) ORDER BY O1, O2, O3 despite I use node and relationship index using APOC procedures but these queries take many time to get result 2175417 ms for the second query. so I have more than two optional match in my queries the query slow down and it give result after a long time or I'm obliged to separate my query by optional match because if I make just one path in a single match query I will get only the result of the last node or relationship that I put in the path and not all the traversed nodes and relationship so with optional math I can store the result of the match executed before + the result of the optional much for example if I execute this query: CALL apoc.index.nodes('entityclazz1','att0:*') YIELD node as N0 OPTIONAL MATCH (N0:entityclazz0)<-[R0:relationshipclazz0]-() WITH distinct N0, N0.att0 as AN0att0, count(R0.att1) as AR0att1, R0.att1 as BR0att1 order by AR0att1 desc,BR0att1,ID(N0), AN0att0 WITH ID(N0) as i, N0.att0 as O1, head(collect(BR0att1)) as O2, N0 RETURN O1, O2, count(i) ORDER BY O1, O2 the result is O1 O2 count(i)0 0 60 1 20 2 300 3 220 null 1201 0 21 2 31 3 31 null 32 but my problem that I have to optimize the time of the query I use NEO4J 3.1.0 <https://lh3.googleusercontent.com/-nJJwcmWvlL0/WNgure4xN1I/AAAAAAAAAXM/m2h6TUI4xjsoLBd01KyNMIP3PLyt-gOhwCLcB/s1600/meta_graph.png> this is the property_graph "meta_graph" of my graph database in which I have 5 node labels and 4 relationship types. each node label correspond to an entity class table in relational database ans each relationship type correspond to a relation "join" table in relational database <https://i.stack.imgur.com/302LU.png> now I want to find links between each attribute X.A and its parents X.K.B with k is a path which relate the attribute X.A and its parents X.B because I work in domain of probabilistic graphical models. I will take a real example to understand more seeing the following pistures in which I have thre node labels professor,course and student and two relationships types takes and teachs and properties "attributes" are in cercles. red arcs present dependencies relationships between properties <https://i.stack.imgur.com/YDdmD.jpg> <https://lh3.googleusercontent.com/-y9yayz4J7S8/WNgwWXBDRfI/AAAAAAAAAXU/FOi1JKDK3_cS8jUrLNOn_XfBCdjp_esYQCLcB/s1600/17474890_668100610060222_1222690006_n.jpg> for example here student.grade depend of student.intelligence and depends of course.difficulty.here to find the probability of this dependency I need to perform counts over each attribute and its parents. if we take the samae example I need to make count of (take.grade=A,take.course.difficulty=low,take.student.intelligence=high) for this instance me query will return how many times in my database I have this combination "observation".So in the case of relational database we need to make join between relation and class tables using foreign keys to be able to navigate beteen table to reach each attribute in its class or relation table. Now in my case I have a generic form of databases that I work with. in wich I have entityclasses which are related by relationshipclasses.entity and relationship classes have attributes att0,att1,att2,... and each attribute "property" has a doamin of value for example the domain value of entityclazz0.att0 is [0,1,2] and the domain value of entityclazz1.att1 is [0,1], etc. to make counts this correspond in sql queries to make select queries in which I can have multiple joins using foreigns keys so my idea is to replace this joins by cypher query in which I use math and optional match clause to make my count of properties "attributes". example of queries are given in my previously in my first question and my comments in the sace of relational database I can start selecting attributes from a relation "join" table or I can start selecting attributes from an entity class table. so that in my cypher queries sometimes I have match ()-[relationshipclazz]-() then a series of optional match and sometime I have match (entityclazz) then a series of optional match. like its mentionad in my first question then because I used APOC procedure I just replaced the first matches clause by respectively *CALL apoc.index.relationships('relationshipclazz0','att0:*') YIELD rel as R0* and *CALL apoc.index.nodes('entityclazz1','att0:*') YIELD node as N0* pleaaaase help me if you have idea because it is urgent I want to optimize my queries because in a big graph database with just 60.000 relationships and nodes these type of queries take a lot of time specialy if I have multiple optional match( which correspond to multiple joins in my sql query) so if I have a big level of joins I translate it by multiple optional mutch or this is take a lot of time in a cypher query I can also give you more details if you need more. thanks 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 neo4j+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.