我正在尝试通过具有特定关系类型的Cypher查询节点。
因此有两个节点A(ID 1)和B(ID 2)。 我在管理GUI中使用Cypher控制台。
如果我这样做: REL: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
QUERY2:
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
答案 0 :(得分:0)
我认为没有问题:
artist-[:SimilarTo]->x-[:SimilarTo]->sim
为您提供标识符artist
和sim
,在某些情况下,艺术家= sim。而
artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim
为artist, x, y, sim
提供了标识符y<>artist
,因为它是sim
- >&gt;我的意思是,如果你将获得与第一种情况相同的标识符,那么密码匹配就会遇到无限循环,即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%确定在标识符下获得相同的节点,或者将查询分成两个独立的部分(如WITH的注释中所建议)或严格定义您不希望查询中的任何循环:
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury'
AND Id(artist)<>Id(sim)
如果你必须经历循环,那么分成2部分查询解决方案