我正在执行类似
的查询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 *
但是我相信这种方法存在一些问题:
RELA
和RELB
s),但我不确定如何考虑这一点我真的在网上找不到任何有关如何将它们作为列表返回时如何过滤关系的文档(由于*
中的[:RELB*]
)
我还应该注意,我需要过滤RELB
的属性是一个数组,我将检查它是否包含某些值,因此我无法选择使用{{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
)。