Cypher-запрос на основе атрибутов узла - PullRequest
0 голосов
/ 06 июня 2018

Чтобы научить себя neo4j, я смоделировал некоторые поведения в игре, в которую играю.

Я создал базу данных neo4j со схемой: Моя схема базы данных

Итак, у Платформы есть Оборудование, у которого есть Режимы.В игре платформы могут взаимодействовать, когда у них общий режим.Любой объект в игре может быть затронут событиями во времени, что делает их неработоспособными.В базе данных графа эти события моделируются как события, которые могут влиять на один или несколько узлов.

Я создал запрос, который позволяет мне спросить «как сеть выглядит в год {год}», чтоработает, говоря, возвращает все узлы, которые не имеют связи с событием:

MATCH (any)
OPTIONAL MATCH (any)--(event:Event) 
WHERE event.year < 2031
WITH any, event
WHERE event IS NULL AND NOT "Event" in LABELS(any)
MATCH(any)
OPTIONAL MATCH (any)<-[:PARTIAL]-(e:Event)
RETURN any, e

, что дает мне график, который представляет сеть, которую я моделирую в 2030 году. Вот график перед любыми событиями (год = 2000) Вот график после первого события (год = 2031)

Я хотел бы задать дополнительные вопросыподграфа, возвращенного вышеупомянутым запросом, например, «Сколько режимов имеет платформа для доступа в данный год?».Я пытался адаптировать приведенный выше запрос:

MATCH (p:Platform),(e:Equipment),(m:Mode)
OPTIONAL MATCH (p)--(event:Event), (e)--(event), (m)--(event) 
WHERE event.year < 2031
WITH p,e,m, event 
WHERE event IS NULL 
MATCH(p),(e),(m) 
RETURN p, e, m

Но это не приближает меня к тому месту, где я хочу, потому что он возвращает все.

Предполагается, что я не пытаюсь сделать что-то, чтопо сути сумасшедший (я изо всех сил пытаюсь найти хорошие ресурсы, чтобы научиться делать подобные запросы), как я могу согнуть шифр, чтобы получить информацию.Я прошу прощения за ясность - я не настолько знаком с доменом, чтобы использовать правильные термины для того, что я пытаюсь сделать.Самое близкое описание, которое я нашел, это «Извлечение подграфов, где ни один узел в этом подграфе не связан с узлом определенного типа с определенными атрибутами»

Любая помощь приветствуется!

Редактировать : После некоторой игры я придумал (я подозреваю, действительно неэффективный способ) вернуть все оборудование, у которого нет событий, или есть события, которые происходят после определенного года:

MATCH (e:Equipment)--(ev:Event)
WHERE ev.year > {year}
RETURN e
UNION 
MATCH (e:Equipment)
WHERE NOT (e)<--(:Event)
RETURN e

Я также нашел этот стековый пост, который мне помог, но я не уверен, сможет ли он получить меня полностью

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Несколько часов почесывает голову и у меня есть способ, который работает.Я понимаю, что это, вероятно, ужасное решение ...

OPTIONAL MATCH (e:Equipment)--(ev:Event)
WHERE ev.year > {year}
WITH collect(e) as validE
MATCH (e:Equipment)
WHERE NOT (e)<--(:Event)
WITH (validE+collect(e)) as validE
UNWIND validE as e
WITH e
OPTIONAL MATCH (m:Mode)--(ev:Event)
WHERE ev.year > {year}
WITH e, collect(m) as validM
MATCH (m:Mode)
WHERE NOT (m)<--(:Event)
WITH e, (collect(m)+validM) as validM2
UNWIND validM2 as m
WITH m, e
MATCH (p:Platform)--(e)--(m)
RETURN p.name, count(m)

Как это работает:

  • Собрать equipment, который не имеет отношения к узлу events со свойством yearзначение меньше, чем год, который нас интересует
  • Размотайте equipment и используйте это, чтобы найти связанный modes, снова проверив год достоверности.
  • Наконец, собрав modes и equipments, нас интересует match platforms.

Примечание:

  • В моем случае совпадение Optional важно, потому что вполне возможно, что в интересующем году больше не будет «будущих» событий.Это приведет к тому, что запрос не даст результатов.

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

0 голосов
/ 06 июня 2018

Этот запрос может делать то, что вы хотите.

MATCH (p:Platform)
OPTIONAL MATCH (event:Event)--(p)
WHERE event.year < 2031
OPTIONAL MATCH (e:Equipment)--(event)
OPTIONAL MATCH (m:Mode)--(event) 
RETURN p, COLLECT(event) AS events, COLLECT(e) AS es, COLLECT(m) AS ms

Для каждого Platform узла он ищет:

  • необязательные связанные Event узлы, чьи year <2031. </li>
  • необязательно Equipment узлов, связанных с указанными выше Event узлами.
  • необязательных Mode узлов, связанных с указанными выше Event узлами.

и возвратами, для каждого Platform узлов, коллекция связанных с ним событий, оборудования и режимов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...