Сопоставлять объекты во вложенном списке с помощью Cypher в neo4j - PullRequest
0 голосов
/ 03 марта 2020

У меня есть список списков компонентов. Для каждого списка компонентов мне нужно сопоставить 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"

, тогда как мне нужна последняя неделя структуры (поэтому я и сортирую ) по списку во вложенном списке. У кого-нибудь есть какие-нибудь намеки на то, как мне этого добиться? Моя первоначальная мысль заключалась в том, что раскрутка будет запускать матч отдельно для каждого внутреннего списка, но, очевидно, это не так. Я новичок в этом :)

Я не знаю, лучше ли это попробовать, но это все еще не работает, но может помочь вам лучше понять, что я пытаюсь сделать

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

1 Ответ

0 голосов
/ 04 марта 2020

Я понял, IDK, если это идеальный ответ, но он сделал то, что хотел

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
...