首页 > 解决方案 > OrientDB 上的“匹配”返回不存在的路径

问题描述

我正在使用 OrientDB 'match' 根据标准获取路径(在图表上),但得到的结果路径不存在。

我有一个“Person”顶点,它有一个“PhoneCall”边缘到另一个“Person”顶点 - 只有一条路径应该是匹配的!所以我期望得到结果: vertex1-edgeX-vertex2 例如 - “jonn Smith --phoneCallX-- dan smith”

我实际上得到的是2条路径:

  1. vertex1-edgeX-vertex2 (jonn Smith --phoneCallX-- dan smith) 还有:
  2. vertex1-edgeX-vertex 1 - 这是不正确的,因为它与第一个结果相同的 edge-@rid 并且它也不是自我边缘:jonn Smith --phoneCallX-- jonn Smith

查询:

MATCH {class:person, as:E1, where:( (   firstName IN ['John']   ) )}.bothE(){class:phoneCall, as:R0}.bothV(){class:person, as:E0, where:( (   lastName IN ['Smith']   ) )} RETURN $paths

我认为这是因为“both()”方法发生的,因为第一个顶点适用于两个过滤器:

  1. 名字 IN ['约翰']
  2. 列表项姓氏 IN ['Smith']

但是仍然 - 我的意思是找到“John-phoneCall-Smith”的所有路径,我在这个 John 和他自己之间获得了优势(不存在),只是因为他的名字是 Smith(这应该是 OTHER 实体的条件这种关系))

请帮助我 - 我做错了什么?

标签: orientdb

解决方案


您可以明确指定两个顶点必须不同。语法是,在 E2 的 WHERE 条件下,$matched.E1 <> $currentMatch

MATCH 
   {class:person, as:E1, where:( (   firstName IN ['John']   ) )}
      .bothE(){class:phoneCall, as:R0}
      .bothV(){class:person, as:E0, where:(lastName IN ['Smith'] AND $matched.E1 <> $currentMatch)} 
RETURN $paths

推荐阅读