【问题标题】:Match objects within a nested list using Cypher in neo4j在 Neo4j 中使用 Cypher 匹配嵌套列表中的对象
【发布时间】:2020-03-03 16:11:58
【问题描述】:

我有一个组件列表。对于每个组件列表,我需要将 pno12 与每个组件匹配并找到与该组件关联的结构周,然后返回每个组件列表中最高的结构周。到目前为止,这是我的查询,但它展开了

with [['000063', '000752', 'R78000', '000854', '000869', '000273', 'P0010', '71700'],
['71700', '000273', '000869', '000063', '000752', 'P0010', 'R78000', '000854']] as names_list
unwind names_list as names
MATCH (p:PNO12{name:"2021110536L4120D110"})
OPTIONAL MATCH (p)-[:OFFERS]->(n)
WHERE (n.name IN names)
AND NOT (n.from_week IS NULL OR n.to_week IS NULL) 
AND NOT (n.from_week = "000000" OR n.to_week = "000000")
WITH COLLECT(n)+COLLECT(p) AS cmps
UNWIND cmps as c
RETURN c.from_week
ORDER BY c.from_week DESC
LIMIT 1

但这给了我 1 个结果

c.from_week
"202045"

而我需要嵌套列表中每个列表的最新结构周(这就是我排序的原因)。有人对我如何实现这一点有任何提示吗?我最初的想法是 unwind 会为每个内部列表单独运行匹配,但显然情况并非如此。我是新手 :)

我不知道这是否是一个更好的尝试,但它仍然不起作用,但可能会帮助您更好地了解我正在尝试做什么

with [['000063', '000752', 'R78000', '000854', '000869', '000273', 'P0010', '71700'], ['71700', '000273', '000869', '000063', '000752', 'P0010', 'R78000', '000854'] ] as names_list

    unwind names_list as names 

        match (p:pno12{name:"2021110536L4120D110"})
        OPTIONAL MATCH (p)-[:OFFERS]->(n)
        WHERE (n.name IN names)
        AND NOT (n.from_week IS NULL OR n.to_week IS NULL) 
        AND NOT (n.from_week = "000000" OR n.to_week = "000000") 
        with collect(n.from_week) as weeks
        return names, weeks 
        order by weeks desc limit 1

【问题讨论】:

  • 你能解释一下这是什么意思吗:“我需要在嵌套列表中为每个列表构建一周”?此外,您指定了LIMIT 1,因此您自然只会得到一个结果。
  • 是的,我使用限制一来获取最近一周,但我需要以某种方式对每个子列表重复此操作

标签: neo4j cypher graph-databases


【解决方案1】:

我想通了,如果这是完美的答案,我想知道,但它做到了我想要的

WITH [
  ['000063', '000752', 'R78000', '000854', '000869', '000273', 'P0010', '71700'],
  ['71700', '000273', '000869', '000063', '000752', 'P0010', 'R78000', '000854']
] as names_list
UNWIND names_list as names 
MATCH (p:PNO12{{name:"2021110536L4120D110"}})
OPTIONAL MATCH (p)-[:OFFERS]->(n)
WHERE (n.name IN ["{'","'.join(names)}"])
  AND NOT (n.from_week IS NULL OR n.to_week IS NULL) 
  AND NOT (n.from_week = "000000" OR n.to_week = "000000")
WITH names AS list, n.from_week AS from_week ORDER BY from_week DESC
RETURN list, collect(from_week)[0] AS weeks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多