Neo4j:在where

时间:2016-09-17 10:15:25

标签: neo4j

我查询了表单

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

任何线索都将受到赞赏。谢谢!

3 个答案:

答案 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

即将发布的Neo4j 3.1

的注意事项

自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;