【问题标题】:'Match' on OrientDB returns a path that doesn't existOrientDB 上的“匹配”返回不存在的路径
【发布时间】:2018-05-29 10:18:45
【问题描述】:

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

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

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

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

查询:

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()”方法with第一个顶点适用于两个过滤器的事实:

  1. 名字 IN ['John']
  2. 列表项 lastName IN ['Smith']

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

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

【问题讨论】:

    标签: orientdb


    【解决方案1】:

    您可以明确指定两个顶点必须不同。 语法是,在 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
    

    【讨论】:

    • 谢谢!真的有帮助。 (但我也支持自边缘,所以我必须仅在不是自边缘的情况下才使用您的解决方案条件。)无论如何 - “系统变量”是否有名称/标题,例如“$matched”和'$ currentMatch'?我想查看整个列表
    • 当然,这里有一个列表orientdb.com/docs/3.0.x/sql/SQL-Match.html#context-variables(实际上很短)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2018-09-11
    • 2011-03-08
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多