has条件过滤

在Gremlin语句中,有一大类是 filter 类型,就是对输入的对象进行条件判断,只有满足过滤条件的对象才可以通过 filter 进入下一步。

has语句是filter类型语句的代表,能够以顶点和边的属性作为过滤条件,决定哪些对象可以通过

hasLabel(labels)

Step hasLabel(labels):object的label和 指定的labels列表中任何一个匹配就可以通过

示例:

  1. // 获取label="person"或者label="software"的顶点
  2. g.V().hasLabel("person","software")

hasId(ids)

Step hasId(ids):object的id 和指定的ids列表中的任何一个匹配就可以通过

示例:

  1. // 获取id为"okram"或"dalaro"或"javeme"的顶点
  2. g.V().hasId("okram","dalaro","javeme")

has(key, value)

Step has(key, value):包含属性”key=value”的object通过,作用于顶点或者边

在HugeGraph中,按照property的值查询之前,应该对property建立索引,否则将无法查到结果并引发异常。(有两个例外:Vertex的PrimaryKeys和Edge的SortKeys)。

创建索引:

  1. // 对"person"的"addr"属性建立secondary索引,可以对Text类型property按值进行查询
  2. graph.schema().indexLabel('personByCity').onV('person').by('addr').secondary().ifNotExist().create()
  3. // 对"person"的"age"属性建立range索引,可以对Number类型property进行范围查询
  4. graph.schema().indexLabel('personByAge').onV('person').by('age').range().ifNotExist().create()

has过滤示例:

  1. // 获取 age=29 的顶点
  2. g.V().has('age', 29)
  3. // 获取 addr=Beijing 的顶点
  4. g.V().has('addr', 'Beijing')

has(label, key, value)

Step has(label, key, value):通过label和属性的名字和值过滤顶点和边

示例:

  1. // 获取 label="person" 且 addr="Beijing" 的顶点
  2. g.V().has('person', 'addr', 'Beijing')

has(key, predicate)

Step has(key, predicate):通过对指定属性用条件过滤顶点和边

示例:

  1. // 获取 age > 20 的顶点
  2. g.V().has('age', gt(20))

hasKey(keys)

Step hasKey(keys):properties包含keys列表中指定的任何一个key时通过

示例:

  1. // 获取所有顶点的 properties中key为age或者name的属性
  2. // 旧版本HugeGraph中只支持传入一个key
  3. g.V().properties().hasKey('age', 'name')

当后端是Cassandra时支持直接将hasKey()作用于顶点:

  1. // 仅当后端是Cassandra时支持
  2. g.V().hasKey('age')

hasValue(values)

Step hasValue(values):properties包含指定的values列表中任意一个值时通过

示例:

  1. // 获取value为"Beijing"或者29的属性
  2. g.V().properties().hasValue("Beijing", 29)

当后端是Cassandra时支持直接将hasValue()作用于顶点:

  1. // 仅当后端是Cassandra时支持
  2. g.V().hasValue("Beijing")

has(key)

Step has(key):有这个属性时通过

示例:

  1. // 获取所有带有age属性的顶点
  2. g.V().has('age')

hasNot(key)

Step hasNot(key):没有这个属性的通过

示例:

  1. // 获取所有不包含age属性的顶点
  2. g.V().hasNot('age')

其他

has()语句既可以用在Vertex,也可以用于Edge,用法完全一样。