说明: 有一些这样的节点 (n:Person{name:"", age:**, sex:""}) 还有一些其他标签的节点,比如(n:Movie{name:“决战紫禁之巅”}),(n:Music{name:“爱你一万年”})等 同时给所有标签类型的节点的name属性建立了标签 create index on:Person(name), create index on:Movie(name),create index on:Music(name)
问题: 现在我知道了节点的名字,要去找这个节点,但是我不知道节点的标签 目前我是在外面用的for 循环 labels = [“Person”, “Movie”, “Music”] for cla in lables: matcher = NodeMatcher(graph) node = matcher.match(cla, name).first() 然后判断node节点是否存在,但是感觉速度好慢的说,该怎么去优化呢? 直接查询name属性,会返回标签不同,name属性值相同的所有节点吗? 另外,对某个属性建立索引,是不是说这个属性的属性值都是唯一的?
我试了下,如果不用标签,直接查询name属性值,会返回不同标签相同属性值的多个节点,而且也没有用到索引
加上标签查询才用上了索引 那是不是说我还是得循环,那如果我数据量大了,感觉这个开销也很大啊,求解
call db.labels() yield label
call apoc.cypher.run("match (n:`"+label+"`) where n.name={a} return n limit 1000", {a:'xxx'}) yield value
return value
能知道节点ID的话最好用节点ID,同时id和标签/和同时用name和标签第一种方式应该比较好目前我测试是这样。 设置唯一KEY之后,KEY默认就会索引的~ 排除不需要查询的标签:
call db.labels() yield label WITH label WHERE label <> 'Label1' AND label <> 'Label2'
call apoc.cypher.run("match (n:`"+label+"`) where n.name={a} return n limit 1000", {a:'xxx'}) yield value
return value
@crazyyanchao 知道ID了就不需要其他东西了,完全可以根据ID直接查询了,ID唯一啊 设置唯一key后,这个key的值是唯一的,那么设置索引后,比如对name设置索引,那么name的属性值是否也唯一, 如果这时候name属性值唯一,那么他与唯一key又有什么区别? 谢谢