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
查询具有WHERE和WITH子句时的Neo4j Cypher执行计划_Neo4j_Cypher - Fatal编程技术网

查询具有WHERE和WITH子句时的Neo4j Cypher执行计划

查询具有WHERE和WITH子句时的Neo4j Cypher执行计划,neo4j,cypher,Neo4j,Cypher,我有一个Neo4j图形数据库,存储人员配置关系和节点。我必须写一个密码来找到家庭和办公室的地址 资源(或员工)的empId和名称。 这是必需的,以便人员配置解决方案能够根据其所在地以及办公室附近的位置来配置资源 MATCH (employee:Employee) <-[:ADDRESS_TO_EMPLOYEE]- (homeAddress:HomeAddress) WHERE employee.id = '70' WITH employee, homeAddress MATCH (

我有一个Neo4j图形数据库,存储人员配置关系和节点。我必须写一个密码来找到家庭和办公室的地址 资源(或员工)的empId和名称。 这是必需的,以便人员配置解决方案能够根据其所在地以及办公室附近的位置来配置资源

MATCH (employee:Employee) <-[:ADDRESS_TO_EMPLOYEE]- (homeAddress:HomeAddress) 
WHERE employee.id = '70' 
WITH  employee, homeAddress 
MATCH (employee)-[:EMPLOYEE_TO_OFFICEADDRESS]->(officeAddress:OfficeAddress) 
RETURN employee.empId, employee.name,  
homeAddress.street, homeAddress.area, homeAddress.city,  
officeAddress.street, officeAddress.area, officeAddress.city
匹配(员工:员工)(办公地址:办公地址)
返回employee.empId,employee.name,
homeAddress.street、homeAddress.area、homeAddress.city、,
officeAddress.street、officeAddress.area、officeAddress.city
此密码返回所需的结果

但是,如果我移动最后一个WHERE条件,就在RETURN子句之前

MATCH (employee:Employee) <-[:ADDRESS_TO_EMPLOYEE]- (homeAddress:HomeAddress) 
WITH  employee, homeAddress  
MATCH (employee)-[:EMPLOYEE_TO_OFFICEADDRESS]->(officeAddress:OfficeAddress) 
WHERE employee.id = '70' 
RETURN employee.empId, employee.name,  
homeAddress.street, homeAddress.area, homeAddress.city,  
officeAddress.street, officeAddress.area, officeAddress.city 
匹配(员工:员工)(办公地址:办公地址)
其中employee.id='70'
返回employee.empId,employee.name,
homeAddress.street、homeAddress.area、homeAddress.city、,
officeAddress.street、officeAddress.area、officeAddress.city
这又给了我同样的结果

那么,在这两种情况下,查询执行计划相同时,哪一个更优化?。我的意思是相同数量的数据库点击和返回的记录

现在,如果我删除WITH子句

MATCH (employee:Employee) <-[:ADDRESS_TO_EMPLOYEE]- 
(homeAddress:HomeAddress),
MATCH (employee)-[:EMPLOYEE_TO_OFFICEADDRESS]->(officeAddress:OfficeAddress) 
WHERE employee.id = '70' 
RETURN employee.empId, employee.name, 
homeAddress.street, homeAddress.area, homeAddress.city, 
officeAddress.street, officeAddress.area, officeAddress.city
匹配(员工:员工)(办公地址:办公地址)
其中employee.id='70'
返回employee.empId,employee.name,
homeAddress.street、homeAddress.area、homeAddress.city、,
officeAddress.street、officeAddress.area、officeAddress.city
结果还是一样的,执行计划也是一样的

在这种情况下我真的需要吗

任何帮助都将不胜感激。

首先,您可以使用来获得查询的性能。尽管如此,只要您在想要的时间内得到想要的结果,密码并不重要,因为行为将根据数据库中运行的密码规划器(版本)而改变。因此,只要cypher通过单元测试和负载测试,其余的都无关紧要(假设测试相当准确)

第二,一般来说,越少越好。想象一下,你必须阅读自己的密码,自己在纸质打印件上查找信息。不是
匹配(officeAddress:officeAddress)首先,您可以使用来获得查询的性能。尽管如此,只要您在想要的时间内得到想要的结果,密码并不重要,因为行为将根据数据库中运行的密码规划器(版本)而改变。因此,只要cypher通过单元测试和负载测试,其余的都无关紧要(假设测试相当准确)

第二,一般来说,越少越好。想象一下,你必须阅读自己的密码,自己在纸质打印件上查找信息。不匹配(officeAddress:officeAddress)
  • 您应该尽可能早地在查询中放入
    WHERE
    子句。这将过滤掉查询其余部分不必处理的数据,避免可能不必要的工作

  • 您应该避免编写一个只传递所有定义变量的
    WITH
    子句(在语法上不是必需的),因为它本质上是一个no-op。它浪费(一点)时间让计划者进行处理,并且使密码代码更难理解

  • 此查询的更简单版本应生成相同的查询计划:

    MATCH (officeAddress:OfficeAddress)<-[:EMPLOYEE_TO_OFFICEADDRESS]-(employee:Employee)<-[:ADDRESS_TO_EMPLOYEE]-(homeAddress:HomeAddress) 
    WHERE employee.id = '70' 
    RETURN
      employee.empId, employee.name,  
      homeAddress.street, homeAddress.area, homeAddress.city,  
      officeAddress.street, officeAddress.area, officeAddress.city
    
  • 您应该尽可能早地在查询中放入
    WHERE
    子句。这将过滤掉查询其余部分不必处理的数据,避免可能不必要的工作

  • 您应该避免编写一个只传递所有定义变量的
    WITH
    子句(在语法上不是必需的),因为它本质上是一个no-op。它浪费(一点)时间让计划者进行处理,并且使密码代码更难理解

  • 此查询的更简单版本应生成相同的查询计划:

    MATCH (officeAddress:OfficeAddress)<-[:EMPLOYEE_TO_OFFICEADDRESS]-(employee:Employee)<-[:ADDRESS_TO_EMPLOYEE]-(homeAddress:HomeAddress) 
    WHERE employee.id = '70' 
    RETURN
      employee.empId, employee.name,  
      homeAddress.street, homeAddress.area, homeAddress.city,  
      officeAddress.street, officeAddress.area, officeAddress.city
    

    谢谢你的快速回复。我已经用配置文件运行了cypher,执行计划是相同的。我同意你将两个关系组合在一行中的方式更具可读性,但我们遵循惯例,在一行中只定义一个关系()。根据u,WHERE子句的位置无关紧要,WITH子句的包含/排除也无关紧要。是这样吗?我读到WITH子句将限制记录的数量,这将成为剩余查询的输入,这样您的查询将始终在小记录集上运行,从而执行得更快。我们正在使用Neo4j 3。3@java_maestros我的意思是在最后的评论中。将信息移动到应答中,但保持距离(如果不是在紧接着)匹配更好。如果把逻辑上相近的东西放在一起,对计划员来说就容易多了。因此,请尽可能靠近比赛场地。99%的情况下,这实际上并不重要(1%是由于密码的另一部分,在比赛和计划者之间设置了逻辑屏障),感谢快速响应。我已经用配置文件运行了cypher,执行计划是相同的。我同意你将两个关系组合在一行中的方式更具可读性,但我们遵循惯例,在一行中只定义一个关系()。根据u,WHERE子句的位置无关紧要,WITH子句的包含/排除也无关紧要。是这样吗?我读到WITH子句将限制记录的数量,这将成为剩余查询的输入,这样您的查询将始终在小记录集上运行,从而执行得更快。我们正在使用Neo4j 3。3@java_maestros我的意思是在最后的评论中。将信息移动到应答中,但保持距离(如果不是在紧接着)匹配更好。如果把逻辑上相近的东西放在一起,对计划员来说就容易多了。因此,请尽可能靠近比赛场地。99%的情况下,这实际上并不重要(1%是计划员在匹配和位置之间设置了逻辑屏障,因为
    ╒═══════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╕
    │"employee"                 │"homeAddress"                         │"officeAddress"                       │
    ╞═══════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╡
    │{"name":"sam","empId":"70"}│{"area":1,"city":"foo","street":"123"}│{"area":2,"city":"bar","street":"345"}│
    └───────────────────────────┴──────────────────────────────────────┴──────────────────────────────────────┘