我通过索引遇到MATCH问题,我希望你能提供帮助。相关讨论可以在这篇文章中找到:Cypher Linked LIst: how to unshift and replace by index
首先,我运行以下非移动查询三次,以便用关系和节点填充链接列表
MATCH (p {id: '123A'})
OPTIONAL MATCH (p)-[r:Foo]->(c)
WITH p, r, COLLECT(c) AS cs
MERGE (cNew {
id:'456B' // and '789C' and 'WXYZ'
})
CREATE (p)-[rNew:Foo {
isFavorite:false,
isOpen:false,
currenttab:'all',
currentdate:2015-10-30T07:00:00.000Z
}]->(cNew)
FOREACH (x IN cs |
CREATE (cNew)-[:Foo {
isFavorite:r.isFavorite,
isOpen:r.isOpen,
currenttab:r.currenttab,
currentdate:r.currentdate
}]->(x)
DELETE r)
RETURN p, rNew, cNew
后来我可以使用此查询获取输出,以便我可以看到我在链接列表数组中的三个元素关系标签Foo
MATCH ()-[r:`language-arts_ALLRESOURCES`]->() RETURN r
isFavorite false
isOpen false
currenttab all
currentdate 2015-10-30T07:00:00.000Z
isFavorite false
isOpen false
currenttab all
currentdate 2015-10-30T07:00:00.000Z
isFavorite false
isOpen false
currenttab all
currentdate 2015-10-30T07:00:00.000Z
然后我尝试使用此密码查询来查询第一个索引
MATCH (p { id:"123A" })
MATCH (p)-[:Foo*1]->()-[r:Foo]->(c)
RETURN c
但我想出下面的错误:
Don't know how to compare that. Left: [:Foo[8258]
{isFavorite:false,isOpen:false,currenttab:"all",currentdate:"2015-10-
30T07:00:00.000Z"}] ($colon$colon); Right: :Foo[8260]
{isFavorite:false,isOpen:false,currenttab:"all",currentdate:"2015-10-
30T07:00:00.000Z"} (RelationshipProxy)
我尝试使用此查询获取:
MATCH (p { id:"123A" })
MATCH (p)-[:Foo*2]->(c)
RETURN c
这是回来的输出
id 789C // which is index 1
关于是否应该使用整数0或1或2来获取索引1,我也有一些轻微的混淆,但是一旦我通过这个问题,我确信可以解决这个问题。“不要知道如何比较。'错误。请帮助我指导正确的索引获取方式并避免上面列出的错误。
我非常感谢你的帮助
**注意**
在阅读了cybersam的回答之后,我在上面提到的包含三个元素的链表结构上运行了以下测试
此查询返回索引0位置的子项:
MATCH (p { id:'123A' })
MATCH (p)-[:Foo*0]->()-[r:Foo]->(c)
RETURN c
此查询返回索引1位置的子项:
MATCH (p { id:'123A' })
MATCH (p)-[:Foo]->()-[r:Foo]->(c)
RETURN c
此查询返回"不知道如何比较它。"错误
MATCH (p { id:'123A' })
MATCH (p)-[:Foo*1]->()-[r:Foo]->(c)
RETURN c
此查询返回索引2位置的子项:
MATCH (p { id:'123A' })
MATCH (p)-[:Foo*2]->()-[r:Foo]->(c)
RETURN c
我假设这最后一个适用于任何> = 2
答案 0 :(得分:1)
Cypher似乎对(据我所知)合法[:Foo*1]
语法感到困惑。如果您只使用[:Foo]
代替逻辑等效的代码,则可以避免错误。
但实际上,获取索引0子的方法是:
MATCH (p { id:"123A" })
MATCH (p)-[r:Foo]->(c)
RETURN c;
或者,为了以更通用的方式获取0索引子项,这将起作用。这个通用模式应始终适用于任何索引(通过用所需索引替换0
),但在使用{{1}时,Cypher中似乎存在一个错误(如上所述) }:
1
我为此创建了neo4j issue 5799。