Cypher Query Regex для выбора вершины и ребра

1

Я пытаюсь проанализировать запрос Cypher с условием соответствия, чтобы извлечь его вершину, соединительные края и условие возврата. Он может иметь еще два регулярных выражения, чтобы найти шаблон. Что может быть Regex1 и Regex2:

MATCH (A)-[E1]->(B), (A)-[E2]->(C), (B)-[E3]->(C)
WHERE E1.TYPE = ''marriedTo'' AND C.NAME = ''Ares''
RETURN A.NAME AS PARENT1_NAME, B.NAME AS PARENT2_NAME

Regex1 Output = ['(A)-[E1]->(B)','(A)-[E2]->(C)','(B)-[E3]->(C)']

Regex2 Output = [E1.TYPE = "marriedTo", 'C.NAME = "Ares"]

MATCH (a)
RETURN a.NAME AS name
ORDER BY a.NAME ASC

Вывод Regex1 = ['(a)']

Regex2 Output = []

MATCH (a), (A)
RETURN a.NAME AS name

Regex1 Output = ['(a)','(A)']

Regex2 Output = []

MATCH (a)-[e]-(b)
RETURN e.TYPE AS type
ORDER BY e.TYPE ASC

Вывод Regex1 = ['(a)-[e]-(b)']

Regex2 Output = []

MATCH (A)-[E1]->(B), (B)-[E2]->(C)
WHERE A.NAME = 'Zeus'
RETURN A.NAME as ANAME, B.NAME AS BNAME, C.NAME AS CNAME
ORDER BY B.NAME ASC, C.NAME ASC

Regex1 Output = ['(A)-[E1]->(B)','(B)-[E2]->(C)']

Regex2 Output = [A.NAME = 'Zeus']

Теги:
cypher
lex

1 ответ

3
Лучший ответ

Для версии javascript посмотрите в конце сообщения

(?<=MATCH)(?:(?:.*?=)?\s+(.+?)\s+)(?=WHERE|RETURN)(?:WHERE\s+(.+?)\s+(?=RETURN))?

См. Регулярное выражение, работающее по адресу https://regex101.com/r/aWo08j/1/

Извините, я использовал питон для строки регулярных выражений. Удалите все \ при использовании в java.

Он должен возвращать две группы для предложения MATCH и вторую группу для предложения WHERE. Таким образом, вы получаете обе секции с одним регулярным выражением.

Пояснение ниже;

Для условия соответствия

(?<=MATCH)   //positive look behind match only that appears after this
(?:          //Non capturing group START match this but do not capture
(?:.*?=)     //Do not capture till first equal to sign in match.
\s+          //Match any spaces
(.+?)         //Match and CAPTURE our match condition
\s+         //Match any spaces
)           //Non capturing group END
(?=WHERE|RETURN) //Positive lookahead match only if followed by WHERE or RETURN

Для тех, где края

(?:        //Non capturing group START
WHERE      //Match WHERE but do not capture
\s+        //Match space after WHERE but do not capture
(.+?)       //This is our where clause MATCH and CAPTURE!
\s+        //Match space after where clause but do not capture
(?=RETURN) //Positive Lookahead capture only if followed by RETURN
)          //Non capturing group END
?          //The whole WHERE clause may or may not occur.

Версия java работает здесь https://repl.it/LR5s/11

EDITED REGEX ДЛЯ ЗАЯВЛЕНИЯ ПО ЗАПРОСУ И ПРИСОЕДИНИТЬ JS VERSION ЗДЕСЬ


Версия скрипта Java

/(?:^MATCH(?:.*?=)?\s+(.+?)\s+)(?=WHERE|RETURN)(?:WHERE\s+(.+?)\s+(?=RETURN))?/img

Теперь решение одно и то же, за исключением двух различий из-за того, что javascript не позволяет искать. Разница объясняется ниже:

/regex-expression/options //This is the format for javascript regular expression
^                         //Beginning of a line
MATCH                     //MATCH is now brought inside the non capturing group as there is no lookbehind in js
/img                      //options i-case insensitive; m-multiline; g-global don't stop after first match

Остальная часть регулярного выражения остается неизменной. Как и раньше, у нас есть две группы, которые вернут наши вершины match и where ребра.

Образец js для этого - https://repl.it/LTis/1.

  • 0
    Отлично работает !!
  • 0
    МАТЧ p = (a) - [* 1..2] -> (b) ГДЕ a.NAME = 'Chaos' ВОЗВРАЩАЕТСЯ b.NAME AS Name ЗАКАЗАТЬ b.NAME
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню