代码之家  ›  专栏  ›  技术社区  ›  Afridi

Cypher-Neo4j查询分析

  •  3
  • Afridi  · 技术社区  · 8 年前

    关于Neo4j的查询分析,我有一些问题。

    PROFILE 
    MATCH (n:Consumer {mobileNumber: "yyyyyyyyy"}),
          (m:Consumer {mobileNumber: "xxxxxxxxxxx"}) 
    WITH n,m 
    MATCH (n)-[r:HAS_CONTACT]->(m) 
    RETURN n,m,r;
    

    输出为:

    enter image description here

    所以根据 Neo4j's Documentation :

    当已经找到开始和结束节点时,展开为 用于查找两个节点之间的所有连接关系。

    MATCH (p:Person { name: 'me' })-[:FRIENDS_WITH]->(fof)-->(p) RETURN
    > fof
    

    因此,在上面的查询中(在我的例子中),首先,它应该找到StartNode和;查找任何关系之前的结束节点。但不幸的是,它只是找到StartNode,然后将扩展所有连接 :HAS_CONTACT 关系,这导致不使用“展开为”运算符。为什么会这样?只有一个 两个节点之间的关系。上存在唯一索引约束 :Consumer{mobileNumber} .为什么上面的查询会扩展所有7个关系?

    操作员:尽管已经检索到所有节点/关系,但为什么需要12 db点击?为什么这个操作只需要6行12 db的调用?

    已编辑

    Graph Data

    我还测试了上述相同查询的不同版本,但返回了相同的查询配置文件结果:

    PROFILE
     MATCH (n:Consumer{mobileNumber: "yyyyyyyyy"})
     MATCH (m:Consumer{mobileNumber: "xxxxxxxxxxx"}) 
     WITH n,m 
     MATCH (n)-[r:HAS_CONTACT]->(m) 
     RETURN n,m,r;
    

    2.

    PROFILE
     MATCH (n:Consumer{mobileNumber: "yyyyyyyyy"}), (m:Consumer{mobileNumber: "xxxxxxxxxxx"}) 
     WITH n,m 
     MATCH (n)-[r:HAS_CONTACT]->(m) 
     RETURN n,m,r;
    

    3.

    PROFILE 
    MATCH (n:Consumer{mobileNumber: "yyyyyyyyy"}) 
    WITH n 
    MATCH (n)-[r:HAS_CONTACT]->(m:Consumer{mobileNumber: "xxxxxxxxxxx"}) 
    RETURN n,m,r;
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Dave Bennett    8 年前

    您正在执行的查询和Neo4j文档中提供的示例 扩展到

    如果希望规划器首先找到两个节点,并查看是否存在关系,则可以使用 shortestPath

    PROFILE 
    MATCH (n:Consumer {mobileNumber: "yyyyyyyyy"}),
      (m:Consumer {mobileNumber: "xxxxxxxxxxx"}) 
    WITH n,m 
    MATCH Path=shortestPath((n)-[r:HAS_CONTACT*1]->(m))
    RETURN n,m,r;
    
        2
  •  2
  •   Dom Weldon    8 年前

    关于这一点的文档似乎有点稀疏(或者说,我找不到合适的文档),如果有任何链接或进一步的解释,我们将不胜感激。

    审视你的提问,我认为你是想说:

    :Consumer 标签n和m,分别带有联系人编号x和y,使用 mobileNumber 指数如果你找到了,试着找一个 -[:HAS_CONTACT]-> 关系来自 n m 。如果找到关系,请同时返回节点和关系,否则不返回任何内容。“

    以这种方式运行此查询需要创建笛卡尔乘积(即,一个包含所有组合的小表) m -在这种情况下,只有一行(但对于其他查询可能更多),然后在这些行之间搜索关系。

    MATCH 子句必须满足才能继续查询,neo知道这两个节点 n 必须通过连接 关系,如果查询要返回任何内容。因此,运行查询(并避免笛卡尔积)的最有效方法如下所示,这就是可以简化查询的方法。

    “查找节点 n 标签和索引的值x 移动枚举器 -[:HAS_CONTACT]-> :消费者 移动枚举器 。返回两个节点和关系,否则不返回任何内容。“

    AUTOSTRING 查询配置文件中的参数。

    如何根据需要更改查询以实现搜索

    如果要更改查询以便 使用扩展到关系,使关系的需求可选,或使用显式迭代执行。以下两个查询都将生成最初预期的查询配置文件。

    PROFILE
     MATCH (n:Consumer{mobileNumber: "xxx"})
     MATCH (m:Consumer{mobileNumber: "yyy"}) 
     WITH n,m 
     OPTIONAL MATCH (n)-[r:HAS_CONTACT]->(m) 
     RETURN n,m,r;
    

    PROFILE
     MATCH (n1:Consumer{mobileNumber: "xxx"})
     MATCH (m:Consumer{mobileNumber: "yyy"}) 
     UNWIND COLLECT(n1) AS n
     MATCH (n)-[r:HAS_CONTACT]->(m) 
     RETURN n,m,r;