Neo4j 对同一集合的不同属性使用equals不会返回任何记录,为什么?
当我使用以下查询时:Neo4j 对同一集合的不同属性使用equals不会返回任何记录,为什么?,neo4j,cypher,Neo4j,Cypher,当我使用以下查询时: MATCH (emp:Employee) WHERE emp.supervisor_id = 159 RETURN emp 我得到的结果是4名员工/节点的supervisor\u id=159 对于这个查询,我还得到一个结果,即1名员工的employeeID=159: MATCH (emp:Employee) WHERE emp.employeeID = 159 RETURN emp 但是当我使用=操作符时,它确实返回(无更改,无记录) 我想这是一个逻辑错误,但我就是想
MATCH (emp:Employee)
WHERE emp.supervisor_id = 159
RETURN emp
我得到的结果是4名员工/节点的supervisor\u id=159
对于这个查询,我还得到一个结果,即1名员工的employeeID=159
:
MATCH (emp:Employee)
WHERE emp.employeeID = 159
RETURN emp
但是当我使用=
操作符时,它确实返回(无更改,无记录)
我想这是一个逻辑错误,但我就是想不出来
任何想法请。在您的查询中,您正在搜索标签为
Employee
的节点,其属性employeeID
等于supervisor\u id
或者根据我的理解,您想要的是使用标签Employee
搜索两个不同的节点
因此,您的查询应该是:
MATCH (emp1:Employee), (emp2:Employee)
WHERE emp1.employeeID = emp2.supervisor_id
CREATE (emp1)-[:MANAGER_OF]->(emp2)
此查询创建笛卡尔积,因此如果有大量Employee
节点,则应使用APOC
过程()批量创建关系,如下所示:
CALL apoc.periodic.iterate(
"MATCH (emp1:Employee) RETURN emp1",
"MATCH (emp2:Employee) WHERE emp1.employeeID = emp2.supervisor_id CREATE (emp1)-[:MANAGER_OF]->(emp2)",
{batchSize:5000, parallel:true}
);
干杯您真正想要什么输出?我期待5个节点。4个节点/员工具有
主管id=159
,一个节点/员工具有员工id=159
。最后,我的目标是在ID为159的员工与其他4名不同的员工之间建立一种关系,例如,-[:MANAGER\u OF]->
。请参阅@logisima的答案。他没有明确地说,但您的查询不起作用的原因是,任何给定的员工节点(emp)显然不是它自己的主管。因此需要有两个雇员节点来相互比较。当然。。。实际上我有100名员工。它们都有属性:employeeID
和supervisor\u id
。拥有supervisor\u id=0的员工
他们是拥有supervisor\u id=employeeid=employeed的其他员工的经理。例如,约翰的雇员id=9,主管id=0(是经理)。Maria的员工id为23,主管id为9(经理id为9-John)。Anne的员工id为67,主管id为9(经理id为9-John)。Harry的员工id为49,主管id=0(是经理)。Anne R.的雇员id为11,主管id为49(经理id为49-Harry)。第一个查询可以正常工作。第二个抛出以下错误:没有名为apoc.periodic.iterate`registered用于此数据库实例的过程。请确保您正确拼写了过程名称,并正确部署了该过程。`FYI-Her is Neo4J我正在使用:版本:3.2.5,版本:Community
您必须安装所有APOC。看看我给出的url,然后转到安装
已安装,Neo4J重新启动,错误保持不变。由于我没有在OSx应用程序下运行Ne04J,所以我确实将JAR
保存在:/Users//Documents/Neo4j/default.graphdb/plugins
下。有什么想法吗?@ligisma:关于你回答中的第一个问题,如果对关系使用UNIQUE
会有帮助吗?e、 g匹配(emp1:Employee),(emp2:Employee),其中emp1.employeeID=emp2.supervisor\u id创建唯一(emp1)-[:MANAGER\u OF]->(emp2)
CALL apoc.periodic.iterate(
"MATCH (emp1:Employee) RETURN emp1",
"MATCH (emp2:Employee) WHERE emp1.employeeID = emp2.supervisor_id CREATE (emp1)-[:MANAGER_OF]->(emp2)",
{batchSize:5000, parallel:true}
);