【问题标题】:Finding indirect paths between two nodes in NEO4j在 NEO4j 中查找两个节点之间的间接路径
【发布时间】:2017-08-30 10:10:58
【问题描述】:

我正在使用密码查询来使用密码查询查找两个节点之间的路径

Match p =  (n{ConceptID: 'C0000039'})-[r]-()-[s]- (m) 
WHERE r.RelationLabel CONTAINS "may_be_treat" or s.RelationLabel CONTAINS "may_be_treat"
RETURN p

但是这个查询可以返回最大深度为 2 的路径,我如何在这个查询中将路径作为变量(2,3,4,5,6),条件为 r.RelationLabel CONTAINS "may_be_treat"

【问题讨论】:

  • 我认为您可以使用variable length 表示法:(n)-[*1..5]->(m):查找所有nm 连接的路径长度不超过5 的节点。我可以推荐使用cheatsheet.
  • @MarcoL 但是这个查询不包括过滤条件,这是我需要的
  • r应该直接连接ns直接连接m吧?
  • 我只是使用“s”来创建路径长度为 2,因为 .理想情况下,我不需要“s”
  • nn1 之间的所有关系都应该有一个包含“may_be_treat”的属性RelationLabel?还是一个就够了?我相信这是一个好主意,可以编辑问题并在其上放置样本数据集和所需的输出。

标签: neo4j path cypher


【解决方案1】:

您可以使用variable-length pattern matching

如果您需要nn1 之间的所有关系都有一个名为RelationLabel 的属性,而CONTAINS 的值是“may_be_treat”,那么您可以结合使用ALL 函数。

Match p =  (n{ConceptID: 'C0000039'})-[*]-(m) 
WHERE ALL (r IN relationships(p) WHERE r.RelationLabel CONTAINS "may_be_treat")
RETURN p

如果只与RelationLabel有一个包含“may_be_treat”的关系就足够了,那么你可以使用ANY函数来代替。

Match p =  (n{ConceptID: 'C0000039'})-[*]-(m) 
WHERE ANY (r IN relationships(p) WHERE r.RelationLabel CONTAINS "may_be_treat")
RETURN p

【讨论】:

  • 有没有办法加快这个查询?因为当我增加路径的深度时,查询需要永远执行,在我的情况下,我在一组节点之间有多个关系。
【解决方案2】:

@Bruno Peres' answer is right.
在此基础上,如果您想控制路径的长度,您可以添加显式的可变长度模式匹配

Match p =  (n{ConceptID: 'C0000039'})-[*1..5]-(m) 
WHERE ANY (r IN relationships(p) WHERE r.RelationLabel CONTAINS "may_be_treat")
RETURN p

或者使用length路径函数。

Match p =  (n{ConceptID: 'C0000039'})-[*]-(m) 
WHERE length(p) < 5 AND ANY (r IN relationships(p) WHERE r.RelationLabel CONTAINS "may_be_treat")
RETURN p

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多