Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 使用WHERE筛选查询而不创建新标识符_Neo4j_Cypher - Fatal编程技术网

Neo4j 使用WHERE筛选查询而不创建新标识符

Neo4j 使用WHERE筛选查询而不创建新标识符,neo4j,cypher,Neo4j,Cypher,这是一个基于neo4j在线培训的初学者问题。(第二章:使用模式过滤) 问题是询问与吉恩·哈克曼共事的演员,而不是他与罗宾·威廉姆斯共事的时候 他们的解决办法是: MATCH (gene:Person {name:"Gene Hackman"})-[:ACTED_IN]->(movie), (other)-[:ACTED_IN]->(movie), (robin:Person {name:"Robin Williams"}) WHERE NOT (robin

这是一个基于neo4j在线培训的初学者问题。(第二章:使用模式过滤)

问题是询问与吉恩·哈克曼共事的演员,而不是他与罗宾·威廉姆斯共事的时候

他们的解决办法是:

MATCH (gene:Person {name:"Gene Hackman"})-[:ACTED_IN]->(movie),
      (other)-[:ACTED_IN]->(movie), 
      (robin:Person {name:"Robin Williams"}) 
WHERE NOT (robin)-[:ACTED_IN]->(movie)
RETURN DISTINCT other;
通过尝试找出为什么第三行需要一个新的标识符,我尝试了以下代码片段,但没有成功

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
WHERE gene.name="Gene Hackman"
    AND other.name <> "Robin Williams"
RETURN DISTINCT other;

MATCH(gene:Person)-[:ACTED_IN]->()您第二次尝试几乎正确,您误用了IN运算符

IN用于验证集合中是否存在元素,或者此处的other.name是字符串

以下是中的一个示例:

MATCH (n:Person) AS persons
WITH collect(persons.name) as names
WHERE NOT 'Gene Hackman' IN names
RETURN names
您可以尝试以下方法:

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
WHERE gene.name="Gene Hackman"
    AND NOT "Robin Williams" = other.name
RETURN DISTINCT other;

MATCH(gene:Person)-[:ACTED_IN]->()您第二次尝试几乎正确,您误用了IN运算符

IN用于验证集合中是否存在元素,或者此处的other.name是字符串

以下是中的一个示例:

MATCH (n:Person) AS persons
WITH collect(persons.name) as names
WHERE NOT 'Gene Hackman' IN names
RETURN names
您可以尝试以下方法:

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
WHERE gene.name="Gene Hackman"
    AND NOT "Robin Williams" = other.name
RETURN DISTINCT other;
MATCH(gene:Person)-[:ACTED_IN]->()您的第一次尝试:

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
WHERE gene.name="Gene Hackman"
AND other.name <> "Robin Williams"
RETURN DISTINCT other;
不幸的是,现在您的结果是按电影聚合的演员名称(字符串)集合,而不是演员(节点)的不同集合。为了避免字符串/节点问题,您可以使用
其他
向前推进,而不是
其他.name
。然后使用
过滤器
谓词,而不是
WHERE NOT
。不过,要返回到一组不同的节点,还需要做一些工作

MATCH (gene:Person{name:"Gene Hackman"})-[:ACTED_IN]->(movie:Movie)<-[:ACTED_IN]-(other)
WITH movie, COLLECT(other) AS costars
WHERE NONE(costar IN costars WHERE costar.name = "Robin Williams")
RETURN movie, costars
MATCH(gene:Person{name:“gene Hackman”})->(movie:movie)你的第一次尝试:

MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other)
WHERE gene.name="Gene Hackman"
AND other.name <> "Robin Williams"
RETURN DISTINCT other;
不幸的是,现在您的结果是按电影聚合的演员名称(字符串)集合,而不是演员(节点)的不同集合。为了避免字符串/节点问题,您可以使用
其他
向前推进,而不是
其他.name
。然后使用
过滤器
谓词,而不是
WHERE NOT
。不过,要返回到一组不同的节点,还需要做一些工作

MATCH (gene:Person{name:"Gene Hackman"})-[:ACTED_IN]->(movie:Movie)<-[:ACTED_IN]-(other)
WITH movie, COLLECT(other) AS costars
WHERE NONE(costar IN costars WHERE costar.name = "Robin Williams")
RETURN movie, costars

MATCH(gene:Person{name:“gene Hackman”})->(movie:movie)嗨,克里斯托夫,谢谢你的跟进。但是,您提供的代码不起作用(它相当于我使用“and other.name”和“Robin Williams”的第一个代码段)还有,你能再解释一下为什么我误用了,如果它几乎是正确的,我如何修复它并使它正常工作?再次感谢。你是对的,它相当于第一个代码片段。但是它在我的机器上工作。我将更新我的答案,以使用INThanks作为回复,新代码给出了错误。嗨,Christophe,t谢谢你的跟进。但是你提供的代码不起作用(它相当于我使用“and other.name”和“Robin Williams”的第一个代码片段)。另外,你能再解释一下为什么我在中误用了,如果它几乎是正确的,我如何修复它并使它正常工作?再次感谢。你说得对。它相当于第一个片段。但是它在我的机器上工作。我将更新我的答案,以便使用INThanks进行回复,新代码给出了错误提示。感谢您的跟进,John,您的代码工作正常,并提供了正确的结果!我试着做了练习,还想看看是否能够重用相同的代码来过滤掉模式,而不是特定的标识符。感谢您的跟进,John,您的代码工作正常,并提供了正确的结果!我试着进行练习,还想看看是否能够重用相同的代码来过滤掉模式,而不是特定的标识符。