【问题标题】:Cypher query can't find node by label密码查询无法按标签找到节点
【发布时间】:2018-08-25 23:41:22
【问题描述】:

我正在使用 neo4j 浏览器按标签在图表中搜索节点。我知道节点存在并且节点上的标签是正确的,但是当我在节点上指定标签时,neo4j 找不到它。

更具体地说,我在 neo4j 浏览器中使用以下密码查询:

match (a:Foo) where a.value = "Bar" return a
(no changes, no records)

但是具有该值的节点确实存在该标签:

match (a) where a.value = "Bar" return labels(a)
["Foo"]

该标签上有一个索引,但我不知道这是否相关。

:schema
Indexes
   ON :Foo(value) ONLINE 

此外,显式重置标签似乎不起作用:

match (a) where a.value = "Bar" 
set a :Foo
return a

将返回应用了正确标签的节点,但是当我重试原始查询时,它仍然找不到该节点。

这以前有效,但我最近对我们的堆大小/页面缓存大小/gc 类型进行了一些更改,试图解决另一个问题,即 100% cpu 在垃圾收集时挂起。这些更改都不应该影响标签。

以前有人有过这种经历吗?

我正在使用 Neo4j CE v3.3.0

【问题讨论】:

  • SET 之前做REMOVE a:Foo 有帮助吗?如果不是,并且这只是单个节点的问题,您可以尝试用新节点替换该节点(并重新创建其所有关系)。
  • @cybersam 添加REMOVE 仍然“有效”,因为它没有抛出错误或任何东西,但我仍然无法按标签找到该节点。
  • 删除索引然后重新创建它可能是值得的。我感觉你的索引已经损坏了
  • @InverseFalcon,我删除并重新创建了它,这似乎解决了问题。知道是什么原因造成的吗?还是一种检测方法?

标签: neo4j cypher


【解决方案1】:

看起来像索引损坏的问题,正如我在评论中提到的那样,删除然后再次创建索引应该可以解决它。

至于索引是如何损坏的,我不能说,但您使用的是 .0 版本,而且这些版本往往比其他版本有更多错误。您可能需要升级到最新的 3.3.x 版本。

您始终可以通过 neo4j-admin 运行一致性检查,以查看您的图形数据是否还有其他问题。

【讨论】:

  • 感谢您的帮助,我运行了一致性检查,找到了几个,但我不知道这些是什么意思或如何修复它,并且在手册中找不到任何内容。有什么想法吗? WARN:DynamicRecord 链中包含的架构规则引用了不在线的架构规则。 DynamicRecord[11,used=true,(53),type=-1,data=byte[size=53],start=true,next=-1] 不符合:IndexRule[id=11, descriptor=Index( GENERAL, :label[106](property[1]) ), provider={key=lucene+native, version=1.0}]
  • 您可以尝试删除并重新创建所有索引和约束,看看是否允许一致性检查通过
【解决方案2】:

这没用

MATCH ( p:item {name:"spam"}) RETURN p.name

(没有变化,没有记录)

但这确实有效:

Match (n:item) Where n.name =~ '.*spam.*' Return n.name, n.purchase

n.name  n.purchase

"""spam"""  8

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多