1

我有一个 Neo4J 数据库,将 COMPANY 映射为节点,并将 RELATED 映射为边。COMPANY 具有 CODE 属性。我想查询数据库并获取与 regexp 匹配的第一个节点COMPANY.CODE =~ '12345678.*',即一个 COMPANY,其 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 吗?

4

1 回答 1

4

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

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

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

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

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

于 2013-11-04T12:27:34.717 回答