0

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

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

如果我这样做: rel:1

我得到两个关系(ID 10 和 11)两个相同节点(ID 3)的结果(我知道这很糟糕,但这就是数据)。如果我查看显示的关系: Node 1 SimilarTo Node 3 Node 1 SimilarTo Node 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
4

1 回答 1

0

我认为那里没有问题:

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

为您提供标识符artist以及sim在某些情况下艺术家 = sim. 然而

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

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

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

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

会给你imo210292 209410 210292 209410 xxxxx

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

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

如果您必须通过循环,则将查询解决方案分为两部分

于 2013-01-17T10:01:54.340 回答