├── LICENSE ├── README.md └── examples.csv /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Tomaz Bratanic 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cypher direction validation competition 2 | This repository that hold the information about the competition about validating and fixing relationship direction in Cypher statements based on the given schema. 3 | 4 | ## Submissions 5 | 6 | * https://github.com/GolvenLD/cypher-direction-competition-entry (Python, RegEx) 7 | * https://github.com/sakusaku-rich/cypher-direction-competition (Python, RegEx) 8 | * https://github.com/grapergrape/cypher-competition (Python) 9 | * https://github.com/mrtnzagustin/cypher-direction-challenge/tree/master (Python, RegEx) 10 | * https://github.com/Frodnar/cypher_direction_validation_entry (Python, RegEx) 11 | * https://github.com/yWorks/cypher-query-validator (TypeScript, Cypher Parser) 12 | * https://github.com/bSharpCyclist/cypher-direction-competition (Python, RegEx) 13 | * https://github.com/sarmbruster/cypher-direction (Python, Cypher Parser) 14 | * https://github.com/nielsdejong/cypher-guard (Python, Cypher Parser) 15 | * https://github.com/filantrop/cypher_fix_relation_directions (Python, Cypher Parser) 16 | * https://github.com/neo4j/jbang-catalog/blob/main/enforce_relationship_directions.java (Java, Cypher Parser) 17 | 18 | 19 | 20 | ## Motivation for the competition 21 | 22 | In the time of LLMs, it is becoming increasingly popular to implement _Retrieval-Augmented Generation_ (RAG) applications, where you feed additional information to an LLM at query time to increase its ability to generate valid, accurate, and up-to-date answers. 23 | This new RAG paradigm is bringing in the revolution in data accessibility, as it means that anybody, even non-technical users, can now ask questions about information stored in the database without requiring them to learn a database query language. 24 | For example, when you want the users to be able to ask questions about the information stored in Neo4j, a graph database, you need to implement a so-called _text2cypher_ module that takes natural language as input and produces Cypher statements as output. 25 | State-of-the-art LLMs are pretty good at generating Cypher statements. 26 | However, most of them share a common flaw: they can sometimes mess up the direction of the relationship in the generated Cypher statement, which can cause significant dissatisfaction among users. 27 | I believe that the direction of the relationship can be deterministically after the LLM generates a Cypher statement based on the provided schema. 28 | Therefore, I am hosting this competition to help us find the best implementation of validating and fixing relationship directions in Cypher statements as accurately and fast as possible. 29 | 30 | The idea is to use the winner's code and add it to LLM libraries like LangChain, LlamaIndex, and others. 31 | By applying to this competition, you are allowing me, or others, to re-use the provided code in any commercial or non-commercial application with appropriate attribution. 32 | 33 | ## Rules of the competition 34 | 35 | 1. Python is preferred (although applications in other languages will be accepted) 36 | 2. No external libraries or tools shall be used. Only [standard, bundled libraries](https://en.wikipedia.org/wiki/Standard_library) apply. The only exceptions are Cypher AST parsers. 37 | 38 | The solutions will be judged based on the following three criterias, in the order given: 39 | 40 | 1. Accuracy of results 41 | 2. Simplicity of the code 42 | 3. Readability of the code 43 | 4. Performance of the code 44 | 45 | Prizes are the following: 46 | 47 | 1. 1500€ 48 | 2. 750€ 49 | 3. 250€ 50 | 51 | Sponsored by Neo4j <3 52 | 53 | Winners' code will be added to this repository. 54 | 55 | ## How to apply 56 | 57 | Fill out the form with your name and the link to a public GitHub repository with the implementation code: https://forms.gle/4pgArm8S8NqRa6sy8 58 | All applications received until Friday, 17th September 2023, 23.59 CEST time will be valid. 59 | 60 | ## Test & Validation file 61 | 62 | The `examples.csv` contains the dataset you can use to validate your implementation. 63 | The CSV contains the following three columns: 64 | 65 | - statement: Input Cypher statement that is used as the input to your implementation 66 | - schema: Given graph schema that you can use to validate relationship direction and correct them if needed 67 | - correct_query: Expected output 68 | 69 | The given schema is given as a list of triples where: 70 | ``` 71 | [(Person, WORKS_AT, Organization)] 72 | ``` 73 | 74 | - first element of the triple specifies the source or start node of a relationship: `Person` 75 | - second element of the triple specifies the relationship type: `WORKS_AT` 76 | - third element of the triple specifies the target or end node of a relationship: `Organization` 77 | 78 | **If the given pattern in a Cypher statement doesn't fit the graph schema, simply return an empty string, (there are two examples like this in the test dataset)** 79 | 80 | Please let me know if you find any bugs in the dataset! 81 | 82 | ## Cypher direction validation guides 83 | 84 | When I was preparing the Cypher examples, I followed these guidelines: 85 | 86 | - **If the given pattern in a Cypher statement doesn't fit the graph schema, simply return an empty string** 87 | 88 | - If the relationship is between two nodes of the same labels, there is nothing to validate or correct 89 | ``` 90 | (:Person)-->(:Person), (:Person)-[:KNOWS]->(:Person) 91 | ``` 92 | - If the input query has an undirected relationship in the pattern, we do not correct it. 93 | ``` 94 | (:Person)--(:Organization), (:Person)-[:WORKS_AT]-(:Organization) 95 | ``` 96 | - If a node label is missing in the defined pattern, we can still validate if it fits the graph schema 97 | ``` 98 | (:Person)-[:WORKS_AT]->() 99 | ``` 100 | - If the input query doesn't define the relationship type, but at least one node label is given of a pattern, we check if any relationship exists that matches the pattern and correct it if needed 101 | ``` 102 | (:Person)-->(), (:Organization)<-[r]-() 103 | ``` 104 | 105 | - When multiple relationships are given or a negation is used in a pattern, make sure that at least one of relationship types of the possible fits the given schema 106 | ``` 107 | (:Person)-[:KNOWS|WORKS_AT]->(:Organization), (:Person)-[:!KNOWS]->(:Organization) 108 | ``` 109 | 110 | - When variable length patten is used, we do not correct the direction or validate the schema 111 | ``` 112 | (:Person)-[:WORKS_AT*]->(:Person), (:Person)-[:WORKS_AT*1..4]->(:Person) 113 | ``` 114 | 115 | - Node labels or relationship types can optionally be wrapped with backticks 116 | ``` 117 | (:`Person`)-[:`WORKS_AT`]->(:Organization) 118 | ``` 119 | 120 | - Graph schema never contains information about multi-labeled nodes, but the input query can have them. For example, the following input query: 121 | ``` 122 | MATCH (a:Person:Actor)-[:ACTED_IN]->(:Movie) 123 | RETURN a, count(*) 124 | ``` 125 | 126 | Will have an accompanying schema: 127 | 128 | ``` 129 | [(Person, ACTED_IN, Movie), (Actor, ACTED_IN, Movie)] 130 | ``` 131 | 132 | Which means that you can use any of the labels of the multi-labeled node to verify relationship directions 133 | 134 | ## Disclaimer 135 | 136 | All rights reserved to change the conditions of the competition if needed or see fit. 137 | 138 | -------------------------------------------------------------------------------- /examples.csv: -------------------------------------------------------------------------------- 1 | statement,schema,correct_query 2 | "MATCH (p:Person)-[:KNOWS]->(:Person) RETURN p, count(*) AS count","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person)-[:KNOWS]->(:Person) RETURN p, count(*) AS count" 3 | "MATCH (p:Person)<-[:KNOWS]-(:Person) RETURN p, count(*) AS count","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person)<-[:KNOWS]-(:Person) RETURN p, count(*) AS count" 4 | "MATCH (p:Person {id:""Foo""})<-[:WORKS_AT]-(o:Organization) RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person {id:""Foo""})-[:WORKS_AT]->(o:Organization) RETURN o.name AS name" 5 | "MATCH (o:Organization)-[:WORKS_AT]->(p:Person {id:""Foo""}) RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (o:Organization)<-[:WORKS_AT]-(p:Person {id:""Foo""}) RETURN o.name AS name" 6 | "MATCH (o:Organization {name:""Bar""})-[:WORKS_AT]->(p:Person {id:""Foo""}) RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (o:Organization {name:""Bar""})<-[:WORKS_AT]-(p:Person {id:""Foo""}) RETURN o.name AS name" 7 | "MATCH (o:Organization)-[:WORKS_AT]->(p:Person {id:""Foo""})-[:WORKS_AT]->(o1:Organization) RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (o:Organization)<-[:WORKS_AT]-(p:Person {id:""Foo""})-[:WORKS_AT]->(o1:Organization) RETURN o.name AS name" 8 | "MATCH (o:`Organization` {name:""Foo""})-[:WORKS_AT]->(p:Person {id:""Foo""})-[:WORKS_AT]-(o1:Organization {name:""b""}) 9 | WHERE id(o) > id(o1) 10 | RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (o:`Organization` {name:""Foo""})<-[:WORKS_AT]-(p:Person {id:""Foo""})-[:WORKS_AT]-(o1:Organization {name:""b""}) 11 | WHERE id(o) > id(o1) 12 | RETURN o.name AS name" 13 | "MATCH (p:Person) 14 | RETURN p, 15 | [(p)-[:WORKS_AT]->(o:Organization) | o.name] AS op","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person) 16 | RETURN p, 17 | [(p)-[:WORKS_AT]->(o:Organization) | o.name] AS op" 18 | "MATCH (p:Person) 19 | RETURN p, 20 | [(p)<-[:WORKS_AT]-(o:Organization) | o.name] AS op","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person) 21 | RETURN p, 22 | [(p)-[:WORKS_AT]->(o:Organization) | o.name] AS op" 23 | "MATCH (p:Person {name:""John""}) MATCH (p)-[:WORKS_AT]->(:Organization) RETURN p, count(*)","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person {name:""John""}) MATCH (p)-[:WORKS_AT]->(:Organization) RETURN p, count(*)" 24 | "MATCH (p:Person) MATCH (p)<-[:WORKS_AT]-(:Organization) RETURN p, count(*)","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person) MATCH (p)-[:WORKS_AT]->(:Organization) RETURN p, count(*)" 25 | "MATCH (p:Person), (p)<-[:WORKS_AT]-(:Organization) RETURN p, count(*)","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person), (p)-[:WORKS_AT]->(:Organization) RETURN p, count(*)" 26 | "MATCH (o:Organization)-[:WORKS_AT]->(p:Person {id:""Foo""})-[:WORKS_AT]->(o1:Organization) 27 | WHERE id(o) < id(o1) RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (o:Organization)<-[:WORKS_AT]-(p:Person {id:""Foo""})-[:WORKS_AT]->(o1:Organization) 28 | WHERE id(o) < id(o1) RETURN o.name AS name" 29 | "MATCH (o:Organization)-[:WORKS_AT]-(p:Person {id:""Foo""})-[:WORKS_AT]-(o1:Organization) 30 | WHERE id(o) < id(o1) RETURN o.name AS name","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (o:Organization)-[:WORKS_AT]-(p:Person {id:""Foo""})-[:WORKS_AT]-(o1:Organization) 31 | WHERE id(o) < id(o1) RETURN o.name AS name" 32 | "MATCH (p:Person)--(:Organization)--(p1:Person) 33 | RETURN p1","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person)--(:Organization)--(p1:Person) 34 | RETURN p1" 35 | "MATCH (p:Person)<--(:Organization)--(p1:Person) 36 | RETURN p1","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person)-->(:Organization)--(p1:Person) 37 | RETURN p1" 38 | "MATCH (p:Person)<-[r]-(:Organization)--(p1:Person) 39 | RETURN p1, r","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person)-[r]->(:Organization)--(p1:Person) 40 | RETURN p1, r" 41 | "MATCH (person:Person) 42 | CALL { 43 | WITH person 44 | MATCH (person)-->(o:Organization) 45 | RETURN o LIMIT 3 46 | } 47 | RETURN person, o","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (person:Person) 48 | CALL { 49 | WITH person 50 | MATCH (person)-->(o:Organization) 51 | RETURN o LIMIT 3 52 | } 53 | RETURN person, o" 54 | "MATCH (person:Person) 55 | CALL { 56 | WITH person 57 | MATCH (person)<--(o:Organization) 58 | RETURN o LIMIT 3 59 | } 60 | RETURN person, o","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (person:Person) 61 | CALL { 62 | WITH person 63 | MATCH (person)-->(o:Organization) 64 | RETURN o LIMIT 3 65 | } 66 | RETURN person, o" 67 | "MATCH (person:Person) 68 | CALL { 69 | WITH person 70 | MATCH (person)-[:KNOWS]->(o:Organization) 71 | RETURN o LIMIT 3 72 | } 73 | RETURN person, o","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)", 74 | "MATCH (person:Person) 75 | CALL { 76 | WITH person 77 | MATCH (person)<-[:WORKS_AT|INVESTOR]-(o:Organization) 78 | RETURN o LIMIT 3 79 | } 80 | RETURN person, o","(Person, KNOWS, Person), (Person, WORKS_AT, Organization), (Person, INVESTOR, Organization)","MATCH (person:Person) 81 | CALL { 82 | WITH person 83 | MATCH (person)-[:WORKS_AT|INVESTOR]->(o:Organization) 84 | RETURN o LIMIT 3 85 | } 86 | RETURN person, o" 87 | "MATCH (p:Person) 88 | WHERE EXISTS { (p)<-[:KNOWS]-()} 89 | RETURN p","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person) 90 | WHERE EXISTS { (p)<-[:KNOWS]-()} 91 | RETURN p" 92 | "MATCH (p:Person) 93 | WHERE EXISTS { (p)-[:KNOWS]->()} 94 | RETURN p","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person) 95 | WHERE EXISTS { (p)-[:KNOWS]->()} 96 | RETURN p" 97 | "MATCH (p:Person) 98 | WHERE EXISTS { (p)<-[:WORKS_AT]-()} 99 | RETURN p","(Person, KNOWS, Person), (Person, WORKS_AT, Organization)","MATCH (p:Person) 100 | WHERE EXISTS { (p)-[:WORKS_AT]->()} 101 | RETURN p" 102 | "MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 103 | WHERE p.name = 'Tom Hanks' 104 | AND m.year = 2013 105 | RETURN m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 106 | WHERE p.name = 'Tom Hanks' 107 | AND m.year = 2013 108 | RETURN m.title" 109 | "MATCH (p:Person)-[:ACTED_IN]-(m:Movie) 110 | WHERE p.name = 'Tom Hanks' 111 | AND m.year = 2013 112 | RETURN m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]-(m:Movie) 113 | WHERE p.name = 'Tom Hanks' 114 | AND m.year = 2013 115 | RETURN m.title" 116 | "MATCH (p:Person)<-[:ACTED_IN]-(m:Movie) 117 | WHERE p.name = 'Tom Hanks' 118 | AND m.year = 2013 119 | RETURN m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 120 | WHERE p.name = 'Tom Hanks' 121 | AND m.year = 2013 122 | RETURN m.title" 123 | "MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 124 | WHERE p.name <> 'Tom Hanks' 125 | AND m.title = 'Captain Phillips' 126 | RETURN p.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 127 | WHERE p.name <> 'Tom Hanks' 128 | AND m.title = 'Captain Phillips' 129 | RETURN p.name" 130 | "MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 131 | WHERE p.name <> 'Tom Hanks' 132 | AND m.title = 'Captain Phillips' 133 | AND m.year > 2019 134 | AND m.year < 2030 135 | RETURN p.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 136 | WHERE p.name <> 'Tom Hanks' 137 | AND m.title = 'Captain Phillips' 138 | AND m.year > 2019 139 | AND m.year < 2030 140 | RETURN p.name" 141 | "MATCH (p:Person)<-[:ACTED_IN]-(m:Movie) 142 | WHERE p.name <> 'Tom Hanks' 143 | AND m.title = 'Captain Phillips' 144 | AND m.year > 2019 145 | AND m.year < 2030 146 | RETURN p.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 147 | WHERE p.name <> 'Tom Hanks' 148 | AND m.title = 'Captain Phillips' 149 | AND m.year > 2019 150 | AND m.year < 2030 151 | RETURN p.name" 152 | "MATCH (p:Person)<-[:FOLLOWS]-(m:Movie) 153 | WHERE p.name <> 'Tom Hanks' 154 | AND m.title = 'Captain Phillips' 155 | AND m.year > 2019 156 | AND m.year < 2030 157 | RETURN p.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)", 158 | "MATCH (p:Person)-[:`ACTED_IN`]->(m:Movie)<-[:DIRECTED]-(p) 159 | WHERE p.born.year > 1960 160 | RETURN p.name, p.born, labels(p), m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:`ACTED_IN`]->(m:Movie)<-[:DIRECTED]-(p) 161 | WHERE p.born.year > 1960 162 | RETURN p.name, p.born, labels(p), m.title" 163 | "MATCH (p:Person)-[:ACTED_IN]-(m:Movie)<-[:DIRECTED]-(p) 164 | WHERE p.born.year > 1960 165 | RETURN p.name, p.born, labels(p), m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]-(m:Movie)<-[:DIRECTED]-(p) 166 | WHERE p.born.year > 1960 167 | RETURN p.name, p.born, labels(p), m.title" 168 | "MATCH (p:Person)-[:ACTED_IN]-(m:Movie)-[:DIRECTED]->(p) 169 | WHERE p.born.year > 1960 170 | RETURN p.name, p.born, labels(p), m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]-(m:Movie)<-[:DIRECTED]-(p) 171 | WHERE p.born.year > 1960 172 | RETURN p.name, p.born, labels(p), m.title" 173 | "MATCH (p:`Person`)<-[r]-(m:Movie) 174 | WHERE p.name = 'Tom Hanks' 175 | RETURN m.title AS movie, type(r) AS relationshipType","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:`Person`)-[r]->(m:Movie) 176 | WHERE p.name = 'Tom Hanks' 177 | RETURN m.title AS movie, type(r) AS relationshipType" 178 | "MATCH (d:Person)-[:DIRECTED]->(m:Movie)-[:IN_GENRE]->(g:Genre) 179 | WHERE m.year = 2000 AND g.name = ""Horror"" 180 | RETURN d.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (d:Person)-[:DIRECTED]->(m:Movie)-[:IN_GENRE]->(g:Genre) 181 | WHERE m.year = 2000 AND g.name = ""Horror"" 182 | RETURN d.name" 183 | "MATCH (d:Person)-[:DIRECTED]->(m:Movie)<--(g:Genre) 184 | WHERE m.year = 2000 AND g.name = ""Horror"" 185 | RETURN d.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (d:Person)-[:DIRECTED]->(m:Movie)-->(g:Genre) 186 | WHERE m.year = 2000 AND g.name = ""Horror"" 187 | RETURN d.name" 188 | "MATCH (d:Person)<--(m:Movie)<--(g:Genre) 189 | WHERE m.year = 2000 AND g.name = ""Horror"" 190 | RETURN d.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (d:Person)-->(m:Movie)-->(g:Genre) 191 | WHERE m.year = 2000 AND g.name = ""Horror"" 192 | RETURN d.name" 193 | "MATCH (d:Person)-[:DIRECTED]-(m:Movie)<-[:IN_GENRE]-(g:Genre) 194 | WHERE m.year = 2000 AND g.name = ""Horror"" 195 | RETURN d.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (d:Person)-[:DIRECTED]-(m:Movie)-[:IN_GENRE]->(g:Genre) 196 | WHERE m.year = 2000 AND g.name = ""Horror"" 197 | RETURN d.name" 198 | "MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 199 | WHERE p.name = 'Tom Hanks' 200 | AND exists {(p)-[:DIRECTED]->(m)} 201 | RETURN p.name, labels(p), m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 202 | WHERE p.name = 'Tom Hanks' 203 | AND exists {(p)-[:DIRECTED]->(m)} 204 | RETURN p.name, labels(p), m.title" 205 | "MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 206 | WHERE p.name = 'Tom Hanks' 207 | AND exists {(p)<-[:DIRECTED]-(m)} 208 | RETURN p.name, labels(p), m.title","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie) 209 | WHERE p.name = 'Tom Hanks' 210 | AND exists {(p)-[:DIRECTED]->(m)} 211 | RETURN p.name, labels(p), m.title" 212 | "MATCH (a:Person)-[:ACTED_IN]->(m:Movie) 213 | WHERE m.year > 2000 214 | MATCH (m)<-[:DIRECTED]-(d:Person) 215 | RETURN a.name, m.title, d.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (a:Person)-[:ACTED_IN]->(m:Movie) 216 | WHERE m.year > 2000 217 | MATCH (m)<-[:DIRECTED]-(d:Person) 218 | RETURN a.name, m.title, d.name" 219 | "MATCH (a:Person)-[:ACTED_IN]-(m:Movie) 220 | WHERE m.year > 2000 221 | MATCH (m)-[:DIRECTED]->(d:Person) 222 | RETURN a.name, m.title, d.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (a:Person)-[:ACTED_IN]-(m:Movie) 223 | WHERE m.year > 2000 224 | MATCH (m)<-[:DIRECTED]-(d:Person) 225 | RETURN a.name, m.title, d.name" 226 | "MATCH (m:Movie) WHERE m.title = ""Kiss Me Deadly"" 227 | MATCH (m)-[:IN_GENRE]-(g:Genre)-[:IN_GENRE]->(rec:Movie) 228 | MATCH (m)-[:ACTED_IN]->(a:Person)-[:ACTED_IN]-(rec) 229 | RETURN rec.title, a.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (m:Movie) WHERE m.title = ""Kiss Me Deadly"" 230 | MATCH (m)-[:IN_GENRE]-(g:Genre)<-[:IN_GENRE]-(rec:Movie) 231 | MATCH (m)<-[:ACTED_IN]-(a:Person)-[:ACTED_IN]-(rec) 232 | RETURN rec.title, a.name" 233 | "MATCH (p:Person)-[:ACTED_IN]->(m:Movie), 234 | (coActors:Person)-[:ACTED_IN]->(m) 235 | WHERE p.name = 'Eminem' 236 | RETURN m.title AS movie ,collect(coActors.name) AS coActors","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie), 237 | (coActors:Person)-[:ACTED_IN]->(m) 238 | WHERE p.name = 'Eminem' 239 | RETURN m.title AS movie ,collect(coActors.name) AS coActors" 240 | "MATCH (p:Person)<-[:ACTED_IN]-(m:Movie), 241 | (coActors:Person)-[:ACTED_IN]->(m) 242 | WHERE p.name = 'Eminem' 243 | RETURN m.title AS movie ,collect(coActors.name) AS coActors","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN]->(m:Movie), 244 | (coActors:Person)-[:ACTED_IN]->(m) 245 | WHERE p.name = 'Eminem' 246 | RETURN m.title AS movie ,collect(coActors.name) AS coActors" 247 | "MATCH p = ((person:Person)<-[]-(movie:Movie)) 248 | WHERE person.name = 'Walt Disney' 249 | RETURN p","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH p = ((person:Person)-[]->(movie:Movie)) 250 | WHERE person.name = 'Walt Disney' 251 | RETURN p" 252 | "MATCH p = ((person:Person)<-[:DIRECTED]-(movie:Movie)) 253 | WHERE person.name = 'Walt Disney' 254 | RETURN p","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH p = ((person:Person)-[:DIRECTED]->(movie:Movie)) 255 | WHERE person.name = 'Walt Disney' 256 | RETURN p" 257 | "MATCH p = shortestPath((p1:Person)-[*]-(p2:Person)) 258 | WHERE p1.name = ""Eminem"" 259 | AND p2.name = ""Charlton Heston"" 260 | RETURN p","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH p = shortestPath((p1:Person)-[*]-(p2:Person)) 261 | WHERE p1.name = ""Eminem"" 262 | AND p2.name = ""Charlton Heston"" 263 | RETURN p" 264 | "MATCH p = ((person:Person)-[:DIRECTED*]->(:Person)) 265 | WHERE person.name = 'Walt Disney' 266 | RETURN p","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH p = ((person:Person)-[:DIRECTED*]->(:Person)) 267 | WHERE person.name = 'Walt Disney' 268 | RETURN p" 269 | "MATCH p = ((person:Person)-[:DIRECTED*1..4]->(:Person)) 270 | WHERE person.name = 'Walt Disney' 271 | RETURN p","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH p = ((person:Person)-[:DIRECTED*1..4]->(:Person)) 272 | WHERE person.name = 'Walt Disney' 273 | RETURN p" 274 | "MATCH (p:Person {name: 'Eminem'})-[:ACTED_IN*2]-(others:Person) 275 | RETURN others.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person {name: 'Eminem'})-[:ACTED_IN*2]-(others:Person) 276 | RETURN others.name" 277 | "MATCH (u:User {name: ""Misty Williams""})-[r:RATED]->(:Movie) 278 | WITH u, avg(r.rating) AS average 279 | MATCH (u)-[r:RATED]->(m:Movie) 280 | WHERE r.rating > average 281 | RETURN average , m.title AS movie, 282 | r.rating as rating 283 | ORDER BY rating DESC","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (User, RATED, Movie)","MATCH (u:User {name: ""Misty Williams""})-[r:RATED]->(:Movie) 284 | WITH u, avg(r.rating) AS average 285 | MATCH (u)-[r:RATED]->(m:Movie) 286 | WHERE r.rating > average 287 | RETURN average , m.title AS movie, 288 | r.rating as rating 289 | ORDER BY rating DESC" 290 | "MATCH (u:User {name: ""Misty Williams""})-[r:RATED]->(:Movie) 291 | WITH u, avg(r.rating) AS average 292 | MATCH (u)<-[r:RATED]-(m:Movie) 293 | WHERE r.rating > average 294 | RETURN average , m.title AS movie, 295 | r.rating as rating 296 | ORDER BY rating DESC","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (User, RATED, Movie)","MATCH (u:User {name: ""Misty Williams""})-[r:RATED]->(:Movie) 297 | WITH u, avg(r.rating) AS average 298 | MATCH (u)-[r:RATED]->(m:Movie) 299 | WHERE r.rating > average 300 | RETURN average , m.title AS movie, 301 | r.rating as rating 302 | ORDER BY rating DESC" 303 | "MATCH (p:`Person`) 304 | WHERE p.born.year = 1980 305 | WITH p LIMIT 3 306 | MATCH (p)<-[:ACTED_IN]-(m:Movie) 307 | WITH p, collect(m.title) AS movies 308 | RETURN p.name AS actor, movies","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:`Person`) 309 | WHERE p.born.year = 1980 310 | WITH p LIMIT 3 311 | MATCH (p)-[:ACTED_IN]->(m:Movie) 312 | WITH p, collect(m.title) AS movies 313 | RETURN p.name AS actor, movies" 314 | "MATCH (p:Person) 315 | WHERE p.born.year = 1980 316 | WITH p LIMIT 3 317 | MATCH (p)-[:ACTED_IN]->(m:Movie)<-[:IN_GENRE]-(g) 318 | WITH p, collect(DISTINCT g.name) AS genres 319 | RETURN p.name AS actor, genres","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person) 320 | WHERE p.born.year = 1980 321 | WITH p LIMIT 3 322 | MATCH (p)-[:ACTED_IN]->(m:Movie)-[:IN_GENRE]->(g) 323 | WITH p, collect(DISTINCT g.name) AS genres 324 | RETURN p.name AS actor, genres" 325 | "CALL { 326 | MATCH (m:Movie) WHERE m.year = 2000 327 | RETURN m ORDER BY m.imdbRating DESC LIMIT 10 328 | } 329 | MATCH (:User)-[r:RATED]->(m) 330 | RETURN m.title, avg(r.rating)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (User, RATED, Movie)","CALL { 331 | MATCH (m:Movie) WHERE m.year = 2000 332 | RETURN m ORDER BY m.imdbRating DESC LIMIT 10 333 | } 334 | MATCH (:User)-[r:RATED]->(m) 335 | RETURN m.title, avg(r.rating)" 336 | "CALL { 337 | MATCH (m:Movie) WHERE m.year = 2000 338 | RETURN m ORDER BY m.imdbRating DESC LIMIT 10 339 | } 340 | MATCH (:User)<-[r:RATED]-(m) 341 | RETURN m.title, avg(r.rating)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (User, RATED, Movie)","CALL { 342 | MATCH (m:Movie) WHERE m.year = 2000 343 | RETURN m ORDER BY m.imdbRating DESC LIMIT 10 344 | } 345 | MATCH (:User)-[r:RATED]->(m) 346 | RETURN m.title, avg(r.rating)" 347 | "MATCH (m:Movie) 348 | CALL { 349 | WITH m 350 | MATCH (m)-[r:RATED]->(u) 351 | WHERE r.rating = 5 352 | RETURN count(u) AS numReviews 353 | } 354 | RETURN m.title, numReviews 355 | ORDER BY numReviews DESC","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (m:Movie) 356 | CALL { 357 | WITH m 358 | MATCH (m)<-[r:RATED]-(u) 359 | WHERE r.rating = 5 360 | RETURN count(u) AS numReviews 361 | } 362 | RETURN m.title, numReviews 363 | ORDER BY numReviews DESC" 364 | "MATCH (p:Person) 365 | WITH p LIMIT 100 366 | CALL { 367 | WITH p 368 | OPTIONAL MATCH (p)<-[:ACTED_IN]-(m) 369 | RETURN m.title + "": "" + ""Actor"" AS work 370 | UNION 371 | WITH p 372 | OPTIONAL MATCH (p)-[:DIRECTED]->(m:Movie) 373 | RETURN m.title+ "": "" + ""Director"" AS work 374 | } 375 | RETURN p.name, collect(work)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person) 376 | WITH p LIMIT 100 377 | CALL { 378 | WITH p 379 | OPTIONAL MATCH (p)-[:ACTED_IN]->(m) 380 | RETURN m.title + "": "" + ""Actor"" AS work 381 | UNION 382 | WITH p 383 | OPTIONAL MATCH (p)-[:DIRECTED]->(m:Movie) 384 | RETURN m.title+ "": "" + ""Director"" AS work 385 | } 386 | RETURN p.name, collect(work)" 387 | "MATCH (p:Person)<-[:ACTED_IN {role:""Neo""}]-(m:Movie) 388 | WHERE p.name = $actorName 389 | AND m.title = $movieName 390 | RETURN p, m","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN {role:""Neo""}]->(m:Movie) 391 | WHERE p.name = $actorName 392 | AND m.title = $movieName 393 | RETURN p, m" 394 | "MATCH (p:Person)<-[:ACTED_IN {role:""Neo""}]-(m) 395 | WHERE p.name = $actorName 396 | AND m.title = $movieName 397 | RETURN p","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN {role:""Neo""}]->(m) 398 | WHERE p.name = $actorName 399 | AND m.title = $movieName 400 | RETURN p" 401 | "MATCH (p:Person)-[:ACTED_IN {role:""Neo""}]->(m:Movie) 402 | WHERE p.name = $actorName 403 | AND m.title = $movieName 404 | RETURN p, m","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:ACTED_IN {role:""Neo""}]->(m:Movie) 405 | WHERE p.name = $actorName 406 | AND m.title = $movieName 407 | RETURN p, m" 408 | "MATCH (wallstreet:Movie {title: 'Wall Street'})-[:ACTED_IN {role:""Foo""}]->(actor) 409 | RETURN actor.name","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (wallstreet:Movie {title: 'Wall Street'})<-[:ACTED_IN {role:""Foo""}]-(actor) 410 | RETURN actor.name" 411 | "MATCH (p:Person)<-[:`ACTED_IN` {role:""Neo""}]-(m:Movie) 412 | WHERE p.name = $actorName 413 | AND m.title = $movieName 414 | RETURN p, m","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:`ACTED_IN` {role:""Neo""}]->(m:Movie) 415 | WHERE p.name = $actorName 416 | AND m.title = $movieName 417 | RETURN p, m" 418 | "MATCH (p:`Person`)<-[:`ACTED_IN` {role:""Neo""}]-(m:Movie) 419 | WHERE p.name = $actorName 420 | AND m.title = $movieName 421 | RETURN p, m","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:`Person`)-[:`ACTED_IN` {role:""Neo""}]->(m:Movie) 422 | WHERE p.name = $actorName 423 | AND m.title = $movieName 424 | RETURN p, m" 425 | "MATCH (p:`Person`)<-[:`ACTED_IN` {role:""Neo""}]-(m) 426 | WHERE p.name = $actorName 427 | AND m.title = $movieName 428 | RETURN p, m","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:`Person`)-[:`ACTED_IN` {role:""Neo""}]->(m) 429 | WHERE p.name = $actorName 430 | AND m.title = $movieName 431 | RETURN p, m" 432 | "MATCH (p:Person)<-[:!DIRECTED]-(:Movie) RETURN p, count(*)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:!DIRECTED]->(:Movie) RETURN p, count(*)" 433 | "MATCH (p:Person)<-[:`ACTED_IN`|`DIRECTED`]-(m:Movie) 434 | WHERE p.name = $actorName 435 | AND m.title = $movieName 436 | RETURN p, m","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie)","MATCH (p:Person)-[:`ACTED_IN`|`DIRECTED`]->(m:Movie) 437 | WHERE p.name = $actorName 438 | AND m.title = $movieName 439 | RETURN p, m" 440 | "MATCH (a:Person:Actor)-[:ACTED_IN]->(:Movie) 441 | RETURN a, count(*)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (Actor, ACTED_IN, Movie)","MATCH (a:Person:Actor)-[:ACTED_IN]->(:Movie) 442 | RETURN a, count(*)" 443 | "MATCH (a:Person:Actor)<-[:ACTED_IN]-(:Movie) 444 | RETURN a, count(*)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (Actor, ACTED_IN, Movie)","MATCH (a:Person:Actor)-[:ACTED_IN]->(:Movie) 445 | RETURN a, count(*)" 446 | "MATCH (a:Person:Actor)<-[:ACTED_IN]-() 447 | RETURN a, count(*)","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (Actor, ACTED_IN, Movie)","MATCH (a:Person:Actor)-[:ACTED_IN]->() 448 | RETURN a, count(*)" 449 | "MATCH (a:Person:Actor) 450 | RETURN a, [(a)<-[:`ACTED_IN`]-(m) | m.title] AS movies","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (Actor, ACTED_IN, Movie)","MATCH (a:Person:Actor) 451 | RETURN a, [(a)-[:`ACTED_IN`]->(m) | m.title] AS movies" 452 | "MATCH (a:Person:Actor) 453 | RETURN a, [(a)-[:`ACTED_IN`]->(m) | m.title] AS movies","(Person, FOLLOWS, Person), (Person, ACTED_IN, Movie), (Person, REVIEWED, Movie), (Person, WROTE, Movie), (Person, DIRECTED, Movie), (Movie, IN_GENRE, Genre), (Person, RATED, Movie), (Actor, ACTED_IN, Movie)","MATCH (a:Person:Actor) 454 | RETURN a, [(a)-[:`ACTED_IN`]->(m) | m.title] AS movies" --------------------------------------------------------------------------------