Cypher查询基于属性的正则表达式查找节点

时间:2013-11-04 11:57:33

标签: neo4j cypher

我有一个Neo4J数据库映射到COMPANY作为节点,RELATED作为边缘。 COMPANY拥有CODE属性。我想查询数据库并获得与正则表达式COMPANY.CODE =~ '12345678.*'匹配的第一个节点,即CODE的前8个字母等于给定字符串文字的公司。

经过多次尝试,我能想到的最好的是以下查询:

START p=node(*) where p.CODE =~ '12345678.*' RETURN p;

结果是以下例外:

org.neo4j.cypher.EntityNotFoundException: 
The property 'CODE' does not exist on Node[0]

看起来Node [0]是数据库中一种特殊的节点,显然没有我的CODE属性。所以,我的查询失败了,因为我没有选择适当类型的节点来查询。但我无法弄清楚如何指定要查询的节点类型。

什么是返回我想要的查询?

我想我需要一个关于CODE的索引来运行这个查询,但是我想知道是否有一个查询可以在不使用这样的索引的情况下完成这项工作。

注意:我正在使用Neo4J 1.9.2版。我应该升级到2.0吗?

1 个答案:

答案 0 :(得分:4)

您可以通过检查属性是否存在来避免异常,

START p=node(*)
WHERE HAS(p.CODE) AND p.CODE =~ '12345678.*'
RETURN p;

您不需要索引可以使用该索引,但索引可能会提高性能。如果您不想要索引,还有其他几个选项。如果您继续使用Neo4j 1.9.x,您可以将代表公司的所有节点分组到一个或多个排序节点下。查询公司节点时,可以从排序节点检索它们并过滤其属性。您可以通过将具有一定范围值的公司分组到一个排序节点下的.code和另一个排序节点下的不同范围来对图表进行分区。如果图表增长,您可以根据需要扩展此分区。

如果升级到2.0(注意:尚未发布,因此不适合生产),您可以从标签中受益。然后,您可以将公司标签分配给所有这些节点,此标签可以维护它自己的索引和唯一性约束。

名为“参考节点”的零节点将不会保留在Neo4j的未来版本中。