利用标签或索引优化节点查询
发布于 6 年前 作者 liutianling 2505 次浏览 来自 问答

说明: 有一些这样的节点 (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属性值相同的所有节点吗? 另外,对某个属性建立索引,是不是说这个属性的属性值都是唯一的?

5 回复

我试了下,如果不用标签,直接查询name属性值,会返回不同标签相同属性值的多个节点,而且也没有用到索引

加上标签查询才用上了索引 Screenshot_2018-10-17 neo4j bolt localhost 7687 - Neo4j Browser(2).png 那是不是说我还是得循环,那如果我数据量大了,感觉这个开销也很大啊,求解Screenshot_2018-10-17 neo4j bolt localhost 7687 - Neo4j Browser.png

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又有什么区别? 谢谢

设置唯一和MYSQL的唯一约束类似,id也和自增ID类似。另外知道节点ID和标签的话可以同时使用这两个,数据量上去了你可以自己测试看看效果~

CREATE CONSTRAINT ON (a:Label) ASSERT a.name IS UNIQUE

@crazyyanchao 谢谢,我试试效果

回到顶部