过滤长途路径

时间:2015-06-03 11:45:19

标签: neo4j cypher

从人们推荐的项目开始,有没有办法在穿越长距离友谊关系时过滤人物属性,例如年龄? 例如,在下面的密码查询中,我只想遍历person + 18y的节点,而不仅仅是过滤p的年龄。

MATCH path = (:Fruit {Name: 'Apple'}) <-[:LIKES]- (:Person) -[:FRIENDOF*1..5]- (p:Person) -[:LIKES]-> (:Device {Name: 'iPhone'}) return path

更新更多详情:

在该实施例中,该图包含分子和支架,其通过递归剥离侧链和环。

MATCH path=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
RETURN path

enter image description here

分子以蓝色显示,支架以红色显示,以环数命名。我们可以看到,从mol25开始,我们有一个结构,在两个边缘距离处有一个环。

因此,我过滤了戒指数量:

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
WHERE s.Num_Rings > 1 
RETURN p

我们得到了同样的照片!带有单个环的支架仍然存在。更糟糕的是来了!

enter image description here

现在我们使用先前的查询提取不同的脚手架节点,首先不过滤环数。

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
RETURN distinct id(s) as ID, s.Name, s.Size, s.Num_Rings

我们期望7个支架节点作为回报...我们只得到4.对环数进行过滤会返回相同的结果。

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
WHERE s.Num_Rings > 1 
RETURN DISTINCT id(s), s.Name, s.Size, s.Num_Rings

从另一个分子开始,而不是从mol25开始,并使用UNWIND从路径中提取节点,它会正确地返回所有脚手架节点,并分别在没有和使用WHERE条件的情况下对其进行过滤。

MATCH p=(m:Molecule) -[:hasSubstructure*1..4]-> (s:Scaffold) 
WHERE id(m)=9 and s.Num_Rings > 1 
UNWIND nodes(p) as n 
RETURN id(n), n.Name, n.Num_Rings, n.Size, n.Smiles

但是,再次返回路径p而不是在限制 - [:hasSubstructure * 1..4] - &gt;时得到正确的图形。方向,但不是没有方向限制 - [:hasSubstructure * 1..4] - 。

如果有人帮忙整理出来,我会很感激。

enter image description here

3 个答案:

答案 0 :(得分:2)

似乎您可以使用简单的WHERE子句,并进行适当的过滤。

MATCH path = (:Fruit {Name: 'Apple'})<-[:LIKES]-
             (intermed:Person)-[:FRIENDOF*1..5]-(p:Person)
             -[:LIKES]->(:Device {Name: 'iPhone'}) 
WHERE intermed.age >= 18 AND
      p.age >= 18
return path

答案 1 :(得分:2)

这里有一些观点:

  

因此,我过滤了戒指数量:

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
WHERE s.Num_Rings > 1 
RETURN p

不要忘记,通过指定可变长度路径,路径完全有可能从mol25scaffold4scaffold1到其他scaffold4并且然后到其他molecule将是有效的,因为边缘的末端是分子而前面的节点具有Num_Rings > 1,与Num_Rings的其他中间节点值无关。

所以中间节点可以是任何东西,如果你想用值&gt;限制到支架。 1,你应该使用ALL子句:

这个查询似乎是基于以下Neo4j控制台做的伎俩:http://console.neo4j.org/r/7f5hc4(属性值有点不同但是......)

MATCH p=(m:Molecule { id: 566 })-[r:HAS_SUBSTRUCTURE*1..3]-(s:Scaffold)<-[:HAS_SUBSTRUCTURE]-(:Molecule)
USING INDEX m:Molecule(id)
WHERE ALL (x IN tail(nodes(p))[0..size(nodes(p))-2] 
           WHERE 'Scaffold' IN labels(x) AND x.rings > 29)
RETURN p

解释:

  • 像你一样匹配路径
  • USING INDEX,通过我对PROFILE的测试,我看到没有使用分子(id)索引,所以我帮助Cypher了一下
  • tail(nodes(p))[0..size(nodes(p))-2]是两个分子之间路径中的节点,请注意nodes(p)[1..size(nodes(p))-2]是等价的
  • 我断言这些节点有ALL标签支架和Num_Rings值&gt; 29(这里29因为它是从Graphgen随机化的)

答案 2 :(得分:0)

这是一个很长的答案,有更多细节。

在该实施例中,该图包含分子和支架,其通过递归剥离侧链和环。

MATCH path=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
RETURN path

enter image description here

分子以蓝色显示,支架以红色显示,以环数命名。我们可以看到,从mol25开始,我们有一个结构,在两个边缘距离处有一个环。

因此,我过滤了戒指数量:

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
WHERE s.Num_Rings > 1 
RETURN p

我们得到了同样的照片!带有单个环的支架仍然存在。更糟糕的是来了!

enter image description here

现在我们使用先前的查询提取不同的脚手架节点,首先不过滤环数。

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
RETURN distinct id(s) as ID, s.Name, s.Size, s.Num_Rings

我们期望7个支架节点作为回报...我们只得到4.对环数进行过滤会返回相同的结果。

MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule) 
WHERE s.Num_Rings > 1 
RETURN DISTINCT id(s), s.Name, s.Size, s.Num_Rings

从另一个分子开始,而不是从mol25开始,并使用UNWIND从路径中提取节点,它会正确地返回所有脚手架节点,并分别在没有和使用WHERE条件的情况下对其进行过滤。

MATCH p=(m:Molecule) -[:hasSubstructure*1..4]-> (s:Scaffold) 
WHERE id(m)=9 and s.Num_Rings > 1 
UNWIND nodes(p) as n 
RETURN id(n), n.Name, n.Num_Rings, n.Size, n.Smiles

但是,再次返回路径p而不是在限制 - [:hasSubstructure * 1..4] - &gt;时得到正确的图形。方向,但不是没有方向限制 - [:hasSubstructure * 1..4] - 。

如果有人帮忙整理出来,我会很感激。

enter image description here