返回前

时间:2019-04-02 21:48:14

标签: neo4j cypher

我正在执行类似

的查询
MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, relationships(p) AS re
RETURN *

我想过滤图形以删除所有RELB(两个NODEB之间的边)没有特定属性的实例,然后再返回。

如果我使用[rels:RELB*]绑定关系并在rels上进行过滤,则查询有效,但是我收到一条消息,指出该功能已被弃用,而改为使用WITH *, relationships(p)。具体消息是

  

该功能已被弃用,并将在以后的版本中删除。   不建议将绑定关系绑定到可变长度模式中的列表。 (不建议将可变长度关系模式绑定到变量(“ rels”),在将来的版本中将不支持。建议的方法是将整个路径绑定到变量,然后提取关系:MATCH p =(。 。)-[...]-(...)带*,relations(p)AS rels)

我尝试过

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, relationships(p) AS re
WHERE ANY (thing IN re WHERE thing.prop = 'value')
RETURN *

但是它似乎仍然返回与第一个查询相同的所有内容

我还尝试了列表理解来过滤关系

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, [re in relationships(p) WHERE re.prop = 'value'] AS re
RETURN *

但是我相信这种方法存在一些问题:

    由于图的性质,
  1. relationships(p)似乎是一个数组的数组
  2. 关系中有多种类型的关系(p)(RELARELB s),但我不确定如何考虑这一点

我真的在网上找不到任何有关如何将它们作为列表返回时如何过滤关系的文档(由于*中的[:RELB*]

我还应该注意,我需要过滤RELB的属性是一个数组,我将检查它是否包含某些值,因此我无法选择使用{{1} }(在查询中(我只是不包括上述内容,以使问题不复杂)

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于不建议使用rels方法(由于某种原因),使用p =RELATIONSHIPS(p)的方法更加麻烦:

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WHERE ALL(thing IN RELATIONSHIPS(p)[1..] WHERE thing.prop = 'value')
RETURN *

顺便说一句,如果您的查询花费很长时间和/或内存不足,那么您可能希望在可变长度关系模式(例如[:RELB*..6])上设置一个合理的上限,因为这种模式的时间和空间复杂度会随着搜索的深度呈指数增长。

[原始答案]

此查询使用rels变量保存仅RELB个关系的列表:

MATCH (n:NODEA)-[:RELA]->(s:NODEB)-[rels:RELB*]->(j:NODEB)
WHERE ALL(thing IN rels WHERE thing.prop = 'value')
RETURN *

我已从模式中删除了p =,因为此查询不需要p。如果需要,可以将其添加回去(但rels列表将为您提供所有RELB关系,因此您可能不需要p)。

如果要要求所有ALL()关系具有所需的属性值,则需要使用ANY()函数(而不是RELB)。