【问题标题】:Why can't I query related nodes of a node via Cypher, where the relationship exists?为什么我不能通过Cypher查询一个节点的相关节点,存在关系?
【发布时间】:2013-01-16 16:10:44
【问题描述】:

我正在尝试通过 Cypher 查询具有特定关系类型的节点。

所以有两个节点 A (ID 1) 和 B (ID 2)。 我在管理 GUI 中使用 Cypher 控制台。

如果我这样做: 相对:1

我得到两个关系(ID 10 和 11)两个相同节点(ID 3)的结果(我知道这很糟糕,但这就是数据)。 如果我查看其中的关系,则会显示: 节点 1 与节点 3 类似 节点 1 与节点 3 类似

如果我试试这个:

START n=node(*) MATCH n-[:SimilarTo]->b WHERE n.Name='A'

我得到一个空结果!?

所以我的问题是,尽管存在两个具有正确起始节点和正确结束节点的关系,为什么我会得到那个空结果?

我不明白。

如果您有任何建议,请告诉我;)

好的,我再举一个例子..

我做了以下查询:

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN artist.artistName, x.artistName, sim.artistName                             

并得到这个结果(是正确的):

artist.artistName x.artistName sim.artistName
"Shining Fury"  "Dragonsfire"   "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Lorenguard"
"Shining Fury"  "Dragonsfire"   "Lorenguard"
"Shining Fury"  "Dragonsfire"   "Shining Fury"
"Shining Fury"  "Dragonsfire"   "Shining Fury"

如果我这样做:

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN artist.artistName, x.artistName, y.artistName, sim.artistName

我明白了(不正确):

artist.artistName x.artistName y.artistName   sim.artistName
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Dragonsfire"
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Ruffians"
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Dragonsfire"
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Ruffians"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Nightqueen"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Dragonsfire"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Nightqueen"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Dragonsfire"

这是不正确的,因为我在 y.artistName 下缺少艺术家“Shining Fury”,就像我在之前的步骤中得到的一样。 我找不到我的错误!

另一个编辑..

查询 1

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN ID(artist), ID(x), ID(sim)

结果:

ID(artist) ID(x) ID(sim)
210292  209410  228580
210292  209410  228580
210292  209410  212568
210292  209410  212568
210292  209410  210292
210292  209410  210292

查询2:

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN ID(artist), ID(x), ID(y), ID(sim)

结果:

ID(artist) ID(x) ID(y) ID(sim)
210292  209410  228580  209410
210292  209410  228580  202357
210292  209410  228580  209410
210292  209410  228580  202357
210292  209410  212568  228580
210292  209410  212568  202279
210292  209410  212568  209410
210292  209410  212568  228580
210292  209410  212568  202279
210292  209410  212568  209410

【问题讨论】:

  • 你确定关系的名字写对了吗?案件很重要。
  • 是的,我确定。我做了另一个我实际使用的例子。我试图通过几个步骤查询一种关系类型。第一步和第二步是正确的,但第三步对我来说显示的值不正确。有两个节点在第二步中存在,但在第三步中丢失了!怎么会这样?
  • 你能通过包含艺术家、x、y 和 sim 的节点 id 来分享这两个查询的输出吗?
  • 是的,当然,我将它们包含在示例中..
  • 怪异的......似乎也无法发现它是什么。可以以某种方式共享您的数据库吗?

标签: neo4j cypher


【解决方案1】:

我认为那里没有问题:

artist-[:SimilarTo]->x-[:SimilarTo]->sim

为您提供标识符artistsim,在某些情况下,艺术家=sim。而

artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim

为您提供标识符artist, x, y, sim,其中y<>artist,因为它后面是sim -> 我的意思是,如果您将获得与第一种情况相同的标识符,那么密码匹配将陷入无限循环,即210292 209410 210292 209410(我敢打赌,“Shining Fury”只与“DragonsFly”有联系,因此除了“DragonsFly”之外,根本不可能有其他 sim 标识符。

尝试再添加 1 个标识符,您还会看到第一个查询的部分,例如:

artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->z-[:SimilarTo]->sim

会给你 imo 210292 209410 210292 209410 xxxxx

我建议 100% 确保您在标识符下获得相同的节点,或者将查询分成 2 个单独的部分(如带有 WITH 的 cmets 中所建议的那样),或者严格定义您不希望在查询中出现任何循环:

MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
AND Id(artist)<>Id(sim)

如果你必须通过循环,然后分成两部分查询解决方案

【讨论】:

  • 好吧,你是对的..艺术家'Shining Fury'与另一位艺术家'Dragonsfly'有(只有一个)联系..因此第一级进展顺利..现在'Drogonsfly'有几个包括一个到开始的连接(Shining Fury),它们都在第二级正确返回.. 执行第三步,不再包含节点(Shining Fury)(如您所说,Cypher 将陷入无限循环).. 但我不明白为什么 cypher 会陷入无限循环,因为定义了匹配的最大步数。
  • 我知道在某些情况下我会得到类似于 210292 209410 210292 209410 aso 的结果。 ......那没关系,但我不明白“无限循环”
  • 以下 Cypher 查询工作和结果也是“循环”: START artist=node:artists('artistMbid:2190dd22-afad-43ee-8728-0bc00621f5ee') MATCH artist-[:SimilarTo ]->x WITH 艺术家,x as level1 MATCH level1-[:SimilarTo]->y WITH 艺术家,level1,y as level2 MATCH level2-[:SimilarTo]->sim RETURN artist.artistName, level1.artistName, level2.artistName , sim.artistName
  • 实际上,无限循环这个术语并不是无限的,我无法更好地解释它,只是 cypher 永远不会遍历一个循环 2 次。 a-b 是一个循环,a-b-a 是一个循环“半”,而 a-b-a-b 是同一个循环的 2 倍。在这一点上,收回我对210292 209410 210292 209410 xxxxx 的声明 - 当且仅当这些节点之间有更多边而不是只有一个“SimilarTo”时,这是可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多