【问题标题】:Neo4j cypher query: Exclude subpaths from MATCHNeo4j 密码查询:从 MATCH 中排除子路径
【发布时间】:2015-11-09 14:58:10
【问题描述】:

我想匹配图表中的某些路径。这些好的路径不应该包含某些子路径,例如避开某些节点。 例如,给定图形

a->b->c->d
a->avoid1->b
c->avoid2->d

注意:在我指定的边之间可能有更多节点,例如a->t0->t1->ba->avoid1->t2->b

现在我想获取从 a 到 d 不包含某些子路径的所有路径,准确地说,这些子路径从 aavoid1b 和从 cavoid2d

我目前(不足)的方法是匹配我正在寻找的整个路径,然后指定我想要避免的节点:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d)
WHERE NOT (avoid1 IN nodes(p))

这不适合我,因为我实际上需要“过滤掉”子路径而不是节点。

我需要这样的东西:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d)
WHERE NOT ( (a)-[:CF*]->(avoid1)->[:CF*]->(b) IN p) AND NOT ( (c)-[:CF*]->(avoid2)->[:CF*]->(d) )

这不起作用,我知道,但它可以帮助解释我需要什么:一种基于路径是否包含某些子路径的事实来过滤路径的方法。

编辑:

命令如下:

MERGE (a:MYTYPE { label:'a' })
MERGE (b:MYTYPE { label:'b' })
MERGE (c:MYTYPE { label:'c' })
MERGE (d:MYTYPE { label:'d' })
MERGE (avoid1:MYTYPE { label:'avoid1' })
MERGE (avoid2:MYTYPE { label:'avoid2' })

CREATE (a)-[:CF]->(b)
CREATE (b)-[:CF]->(c)
CREATE (c)-[:CF]->(d)

CREATE (a)-[:CF]->(avoid1)
CREATE (avoid1)-[:CF]->(b)
CREATE (c)-[:CF]->(avoid2)
CREATE (avoid2)-[:CF]->(d)

和我目前的尝试(正如戴夫的回答所建议的那样):

MATCH (a:MYTYPE { label:'a' })
MATCH (b:MYTYPE { label:'b' })
MATCH (c:MYTYPE { label:'c' })
MATCH (d:MYTYPE { label:'d' })
MATCH (avoid1:MYTYPE { label:'avoid1' })
MATCH (avoid2:MYTYPE { label:'avoid2' })

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d)
WHERE NOT ( (a)-[:CF*]->(avoid1 {label:'avoid1'})-[:CF*]->(b) ) 

RETURN p

然而,这给了我“(没有行)”。

【问题讨论】:

  • 您好@gogo_gorila,您对此有解决方案吗?我有类似的问题,我想看看你的方法
  • @bmalbusca 不,很久没有研究这个话题了。
  • 好的,我找到了解决此类问题的方法。首先要做的是排除在源节点变量上结束的可能路径,并排除使用结束节点变量的正向路径。然后,使用apoc.path.combine() 组合子路径

标签: neo4j cypher


【解决方案1】:

这个查询应该允许你过滤路径:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d)
WHERE NOT ( (a)-[:CF*]->()-[:CF*]->(b)) 
AND NOT ( (c)-[:CF*]->()-[:CF*]->(d) )
return p;`

您还可以为要过滤的节点指定标签/属性:

MATCH p=(a)-[:CF*]->(b)-[:CF*]->(c)-[:CF*]->(d)
WHERE NOT ( (a)-[:CF*]->(:Person {name:'Dave'})-[:CF*]->(b)) AND NOT ( (c)-[:CF*]->()-[:CF*]->(d) )
return p;

【讨论】:

  • 我添加了创建图表的命令。我无法让你的建议发挥作用。你能重新检查一下吗?
  • 这不是从路径中排除与avoid1有关系的节点,而是将a和avoid1之间的关系排除在路径中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多