exists()用法问题

官方定义:exists()的用法是。如果指定的属性在点、边或映射中存在,则返回true,否则返回false
MATCH (n:player) RETURN exists(n.id), n IS NOT NULL

问题是:
有TAG。 CREATE TAG player(name string, age int);
插入一条数据。INSERT VERTEX player (name) VALUES “11”:(“n1”);
这时age的内容为null 但是属性是存在的。
也就是说 MATCH (p:player) RETURN exists(p.age) 返回的结果是true

那如何在插入时,让没有的属性值的点就没有属性呢?

误解了 exists的意思, exists是指 schema层面的 是否有这个属性, 而具体这个属性的值是否是null 则不管

那这就有意思了。那这个函数使用的场景岂不是只能在返回结果是多种类型时才能使用?因为只要类型确定了就必包含它的属性,如果match匹配出多个类型的点,可以使用exists判断是否存在某个属性判断属于某种类型,但是也可以用type函数进行判断,那这个exits存在的意义又是什么呢。

1、 exists 的功能 不仅仅限于 判断属性是否存在, 还可以 加pattern ,只不过这个功能目前还没有开发
例如:

MATCH (n)
WHERE exists(n.name)
RETURN
  n.name AS name,
  exists((n)-[:MARRIED]->()) AS is_married

2、当 业务只需要通过判断 属性的方式过滤数据, 使用type就无法解决了

对于 neo4j 来说,某个属性值为 null 等价于这个点没有这个属性,测试如下:

neo4j@neo4j> create (v:t2{name:"v1",age:null});
Added 1 nodes, Set 1 properties, Added 1 labels

neo4j@neo4j> create (v:t2{name:"v1"});
Added 1 nodes, Set 1 properties, Added 1 labels

neo4j@neo4j> match (v:t2) return v,v.age,exists(v.age);
+--------------------------------------------+
| v                  | v.age | exists(v.age) |
+--------------------------------------------+
| (:t2 {name: "v1"}) | NULL  | FALSE         |
| (:t2 {name: "v1"}) | NULL  | FALSE         |
+--------------------------------------------+

对于 nebula 来说,允许属性值为 null,这种情况是与 neo4j 不同的,其他用法应该都是一样的。

(czp@nebula) [nba]> create tag t2(name string,age int)
Execution succeeded (time spent 4549/4744 us)

(czp@nebula) [nba]> insert vertex t2(name) values "v1":("v1")
Execution succeeded (time spent 4554/4775 us)

(czp@nebula) [nba]> create tag index t2_1 on t2(name(3))
Execution succeeded (time spent 4497/4763 us)

(czp@nebula) [nba]> rebuild tag index t2_1
+------------+
| New Job Id |
+------------+
| 36         |
+------------+
Got 1 rows (time spent 5040/5289 us)

(czp@nebula) [nba]> match (v:t2) return v,v.age,exists(v.age);
+---------------------------------------+----------+---------------+
| v                                     | v.age    | exists(v.age) |
+---------------------------------------+----------+---------------+
| ("v1" :t2{age: __NULL__, name: "v1"}) | __NULL__ | true          |
+---------------------------------------+----------+---------------+
Got 1 rows (time spent 16813/17165 us)

(czp@nebula) [nba]> match (v:t2) where exists(v.noexist_prop) return v;
+---+
| v |
+---+
+---+

谢谢

浙ICP备20010487号