neo4j Cypher中属性名称字符串的正则表达式

zsohkypk  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(145)

我知道可以使用正则表达式表示属性值,例如:

MATCH (n)
WHERE n.SomeProperty =~ 'somestring*'
RETURN n;

我想要的是使用正则表达式的属性名称,并检查所有的属性,开始与某个字符串一样,例如:

MATCH (n)
WHERE n.`SomeProperty*` > 10
RETURN n;

所以我想要所有的节点都有一个属性,以'SomeProperty'开头,并且这个属性的值大于10。
像我的例子中那样使用正则表达式似乎是不可能的。我试过了,但我的研究没有找到解决方案。有人知道如何使用另一种技术来实现这一点吗?

kfgdxczn

kfgdxczn1#

给定以下测试图

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}│
└────────────────────────┘

请记住,它实际上不是一个优化的图形查询,所以在大小合适的数据库上运行速度会很慢。

4szc88ey

4szc88ey2#

我创建了如下示例节点:

Create (n1:RexNode {someproperty10: 10}),
   (n2:RexNode { someproperty11: 11}),
  (n3:RexNode {someproperty12: 12})

然后我使用这个查询返回n2和n3。正如你所看到的,n1以某个属性开始,但是值不大于10。量词是ANY,所以它只会查找至少一个属性(节点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}│
└─────────────────────┘

相关问题