Cypher LinkedList按索引匹配,但不知道如何比较它。"代替

时间:2015-10-31 01:43:43

标签: neo4j cypher

我通过索引遇到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

1 个答案:

答案 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