Neo4j/Cypher:提取 StringArray 的最后一项(这就是 neo4j 所说的)

Neo4j/Cypher: Extracting the last item of a StringArray (This what neo4j called it)

假设我有一个带有 属性、Event 的节点,它被分配了一个 StringArray。我正在尝试提取在创建节点时从集合中分配的“6013”和“6005”(请参阅​​下面的创建查询代码)并将它们分配给另一个 属性。

我尝试使用 SPLIT 但它不适用于 neo4j 所指的 StringArray。

Event: ["EventLog/6013", "EventLog/6005"]

创建查询:从集合中分配的事件

... WITH act.timestamp as timestamp, COLLECT(DISTINCT act.message) as messages, COLLECT(DISTINCT obt.filename) as filenames, COLLECT(act) as acts CREATE (a{ Event: filenames, Description:messages, timestamp:timestamp}) FOREACH (act in acts | CREATE (act)-[:LINK]->(a))

所需节点:

Event: ["EventLog/6013", "EventLog/6005"] Assinged: [6013, 6005]

您可以 list comprehension 对列表中的每个项目执行 extraction/transformation(extract() 也可以这样做,但我更喜欢列表理解语法)。

从那里开始,问题是要遵循什么规则才能从字符串中获取所需的值。

如果值始终为 4 位数字,并且从不存在任何尾随空格,那么您可以使用 right(event, 4) 获取字符串的最后 4 个字符。

如果数字可以有不同的大小,但每个字符串的前缀总是"EventLog/",那么您可以使用substring(event, 9)获取第9个字符后的子字符串。

如果前缀可以变化,而您所知道的只是您想要的部分在第一个“/”字符之后,那么您可以使用 split(),得到结果列表的第二部分,如下所示:split(event, '/')[1].

无论如何,如果您希望该值是整数而不是字符串,则需要对结果使用 toInteger()

下面是使用 right() 函数使用列表理解的示例:

WITH ["EventLog/6013", "EventLog/6005"] as events
RETURN [event in events | toInteger(right(event, 4))] as extractedValues