我查询了表单
match (n:specified_label)-[r:specific_edge]->(m)
where m.name contains 'word_1'
or m.name contains 'word_2'
or m.name contains 'word_3'
...
or m.name contains 'word_100'
return m
我想用单个函数替换所有contains语句(可以是APOC插件,或API调用,或任何东西),它接受单个参数(m.name)并根据m是否返回true / false .name包含任何' word_1' ...' word_100'作为子串。
请注意' word_1',' word_2',...' word_100'应该在函数的实现中进行硬编码,而不是出现在查询的任何地方。
match (n:specified_label)-[r:specified_edge]->(m)
where is_good(m.name)
return m
任何线索都将受到赞赏。谢谢!
答案 0 :(得分:0)
程序不能用于表达式。但是你可以编写一个签名为:
的程序Stream<NodeResult> isGood(@Name("node") Node n)
根据您的逻辑返回包含n的一个元素流或一个空流。对于NodeResult,请参阅https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/master/src/main/java/apoc/result/NodeResult.java。
你的密码似乎是
match (n:specified_label)-[r:specified_edge]->(m)
call is_good(m) yield node
return node
自3.1.0-M09以来,除现有程序外,还有用户定义的功能。函数可以用作表达式的一部分,例如在哪里过滤。但是,功能仅限于执行只读操作。有关详细信息,请参阅https://neo4j.com/release-notes/neo4j-3-1-0-m09/。
答案 1 :(得分:0)
match (n:specified_label)-[r:specified_edge]->(m)
CALL stored.proc.isGood(m) YIELD result AS is_good
WITH n, r, m, is_good
WHERE is_good = TRUE
只需正常调用存储过程,匹配返回的每一行都会调用一次。然后使用常规的旧WHERE
子句过滤结果。
答案 2 :(得分:0)
您可以使用包含N个替代名称的单个正则表达式,而不是使用N个单独的CONTAINS
术语或编写自定义过程。这也允许您将备用名称字符串的集合作为parameter传递。
例如,此查询将此类参数(words
)中的名称连接到|
- 分隔的字符串中,然后在单个正则表达式中使用该字符串:
WITH REPLACE(TRIM(REDUCE(s = '', w IN {words} | s + w + ' ')), ' ', '|') AS ws
MATCH (n:specified_label)-[r:specific_edge]->(m)
WHERE m.name =~ ('.*' + ws + '.*')
RETURN m;