Регулярное выражение для строки имени свойства в Cypher
Я знаю, что можно использовать регулярные выражения для значений свойств, например:
MATCH (n)
WHERE n.SomeProperty =~ 'somestring*'
RETURN n;
Я хочу использовать регулярное выражение для имени свойства и проверять все свойства, которые начинаются с определенной строки, например:
MATCH (n)
WHERE n.`SomeProperty*` > 10
RETURN n;
Поэтому я хочу, чтобы все узлы имели свойство, начинающееся с «SomeProperty», и имели значение > 10 для этого свойства.
Это невозможно с использованием регулярных выражений, как в моем примере. Я пробовал это, и с моими исследованиями я не смог найти решение. Есть ли у кого-нибудь идея, как добиться этого, используя другую технику?
2 ответа
Учитывая следующий тестовый график
CREATE (:TestNode {somePropertyOne: 10})
CREATE (:TestNode {somePropertyTwo: 11})
CREATE (:TestNode {somePropertyThree: 12})
CREATE (:TestNode {someOtherProperty: 13})
Следующий запрос достигает того, что вы хотите
MATCH (n)
WHERE ANY(x IN keys(n) WHERE x STARTS WITH 'someProperty' AND n[x] > 10)
RETURN n
╒════════════════════════╕
│"n" │
╞════════════════════════╡
│{"somePropertyTwo":11} │
├────────────────────────┤
│{"somePropertyThree":12}│
└────────────────────────┘
Имейте в виду, что на самом деле это не оптимизированный запрос для графиков, поэтому он будет медленным для баз данных приличного размера.
Я создал образцы узлов, как показано ниже:
Create (n1:RexNode {someproperty10: 10}),
(n2:RexNode { someproperty11: 11}),
(n3:RexNode {someproperty12: 12})
Затем я использовал этот запрос для возврата n2 и n3. Как видите, n1 начинается с некоторого свойства, но его значение не превышает 10. Квантификатор — ЛЮБОЙ, поэтому он будет искать хотя бы одно свойство (ключ узла n) и возвращать его.
MATCH (n)
WITH n
WHERE
ANY( k in keys(n)
WHERE k STARTS WITH 'someproperty'
AND n[k] > 10
)
RETURN n
Результат:
╒═════════════════════╕
│"n" │
╞═════════════════════╡
│{"someproperty11":11}│
├─────────────────────┤
│{"someproperty12":12}│
└─────────────────────┘