Graph Neo4j电影教程查询

Graph Neo4j电影教程查询,graph,neo4j,cypher,Graph,Neo4j,Cypher,我正在看Neo4j电影示例项目: 其中一个例子是为汤姆·汉克斯推荐新的合作演员,即。 寻找汤姆·汉克斯还没有合作过的演员,但他的合作演员已经合作过了 查询: MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors) WHERE NOT (tom)-[

我正在看Neo4j电影示例项目:

其中一个例子是为汤姆·汉克斯推荐新的合作演员,即。 寻找汤姆·汉克斯还没有合作过的演员,但他的合作演员已经合作过了

查询:

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
      (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors)
WHERE NOT (tom)-[:ACTED_IN]->(m2)
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC
MATCH(tom:Person{name:“tom Hanks”})->(m)(m2)(m2)
按建议返回cocoActors.name,按强度描述将(*)计算为强度顺序
排名前三的结果是: 推荐强度 汤姆克鲁斯5 扎克·格雷尼尔5 海伦亨特4

然而,海伦·亨特在汤姆·汉克斯的合作演员名单中再次出现:

MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name
MATCH (tom:Person {name:"Helen Hunt"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name 

MATCH(tom:Person{name:“tom Hanks”})-[:ACTED_IN]->(m)(m)这个查询没有找到tom Hanks还没有合作过的人。我不确定他们的目的是什么,但要做到这一点,你应该:

MATCH (tom:Person)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActors:Person),
      (coActors)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActors:Person)
WHERE tom.name = 'Tom Hanks' AND
      NOT (tom)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActors)
RETURN coCoActors.name AS recommended, count(*) AS strength 
ORDER BY strength DESC;

MATCH(tom:Person)-[:ACTED_IN]->(:Movie)(:Movie)(:Movie)(m2)
从他们的查询中没有任何意义;他们所做的只是断言汤姆·汉克斯没有在他的合作演员和合作演员共同出演的任何一部电影中出演。毫无疑问,汤姆·汉克斯从未与那些被绑定到
cocoacators

的人合作过,你在哪里看到这个问题?我在movies-java-spring-data-neo4j-4 repository中似乎找不到足够有趣的地方,因为它们具有正确的查询形式,声明“您可能还想声明Tom Hanks从未与推荐的人合作过,不仅仅是在他的合作者参与的电影中。”您还可以添加一个限制
和id(Tom)id(coCoActos)
以避免coCoActors与tom匹配的情况。