一周前开始使用Cypher(真的很喜欢)。在“浏览器”界面中,我正在运行两个查询:
1) start n=node:Node(name="foo") match (n)-[r*..4]-(m) return n,m
2) match (n{name:"foo"})-[r*..4]-(m) return n,m
第一个查询几乎立即返回,第二个查询超过一小时并且计数。天真的我会认为这些是等价的,显然它们不是。我在neo-shell中运行了一个'较小'(路径最多为1)版本,因此我可以对它们进行分析。
profile start n=node:Node(name="foo") match (n)-[r*..1]-(m) return n,m;
ColumnFilter(symKeys=["m", "n", " UNNAMED51", "r"], returnItemNames=["n", "m"], _rows=4, _db_hits=0)
TraversalMatcher(start={"expr": "Literal(foo)", "identifiers": ["n"], "key": "Literal(name)",
"idxName": "Node", "producer": "NodeByIndex"}, trail="(n)-[*1..1]-(m)", _rows=4, _db_hits=5)
profile match (n{name:"foo"})-[r*..1]-(m) return n,m
ColumnFilter(symKeys=["n", "m", " UNNAMED33", "r"], returnItemNames=["n", "m"], _rows=4, _db_hits=0)
Filter(pred="Property(n,name(0)) == Literal(foo)", _rows=4, _db_hits=196870)
TraversalMatcher(start={"producer": "AllNodes", "identifiers": ["m"]},
trail="(m)-[*1..1]-(n)", _rows=196870, _db_hits=396980)
从其他stackoverflow问题我了解db_hits很好看,所以看起来第二个查询基本上完成了线性扫描(我的db几乎是400k节点)。这似乎是由“AllNodes”的“生产者”值而不是“NodeByIndex”确认的。
显然,我需要以不同的方式指定匹配(谓词),以便它命中索引。索引在参数'name'上称为'Node'。我的谷歌搜索,stacko搜索让我失望..如何在匹配中指定条件以使其达到索引?
的更新 的 经过一番探讨之后,似乎我正在使用“遗留”指数?然后尝试使用'新风格(不要使用开始)查询...(有点推断这里)。所以我可以做到以下几点:
create index ON :label(name)
这将为name属性上的特定标签提供索引,但我真的想在所有节点名称上使用索引(我猜非遗留索引)。我有一些重要的用例(用户可能不知道标签,但知道名称)。
非常感谢任何建议或指导。
答案 0 :(得分:0)
现在没有全局模式索引,因此您可能希望在Entity
或Node
等通用标签上创建索引,并创建如下索引:
create index on :Entity(name);
并将该实体标签添加到您的所有节点。
match (n) set n:Entity;