Neo4j APOC后续的Cypher查询功能链

时间:2018-05-08 06:51:03

标签: neo4j cypher neo4j-apoc

我需要组织1..N函数的后续链(apoc.index.in调用),如下所示:

MATCH (d:Decision)-[:HAS_VALUE_ON]->(ch:Characteristic) WHERE ch.id = 10
CALL apoc.index.in(ch,'HAS_VALUE_ON','property.2.5:7 AND value:45') YIELD node AS decision

MATCH (decision)-[:HAS_VALUE_ON]->(ch:Characteristic) WHERE ch.id = 23
CALL apoc.index.in(ch,'HAS_VALUE_ON','property.1.8:326 OR property.4:17') YIELD node AS decision

MATCH (decision)-[:HAS_VALUE_ON]->(ch:Characteristic) WHERE ch.id = 19
CALL apoc.index.in(ch,'HAS_VALUE_ON','property.15.3:"mike" OR value:43') YIELD node AS decision

RETURN decision

正如您所看到的,我需要根据apoc.index.in中描述的不同条件过滤Decision的集合,例如'property.15.3:"mike" OR value:43'等等。

现在上面的查询不起作用。是否可以将APOC链接起来,如果可以的话,请你展示一个例子。

1 个答案:

答案 0 :(得分:1)

如果您可以发送包含您计划使用的值的映射的列表参数,则应该能够执行此操作。例如,提供了以下列表参数:

inputs = [{chId:10, predicate:"property.2.5:7 AND value:45"}, {chId:23, predicate:"property.1.8:326 OR property.4:17"}, {chId:19, predicate:"property.15.3:'mike' OR value:43"}]

(根据你正在使用的语言,你需要弄清楚伏都教是否能够正确地逃脱'mike'周围的内部引号)

然后您可以使用以下查询:

UNWIND $inputs as input
MATCH (ch:Characteristic) 
WHERE ch.id = input.chId AND ()-[:HAS_VALUE_ON]->(ch)
CALL apoc.index.in(ch,'HAS_VALUE_ON', input.predicate) YIELD node AS decision
RETURN decision

由于集合上的UNWIND,集合的每个元素都将产生自己的行,并且后续的MATCH和CALL将按行执行,因此您的决策结果应包含符合相关条件的任何决策。 / p>