从人们推荐的项目开始,有没有办法在穿越长距离友谊关系时过滤人物属性,例如年龄? 例如,在下面的密码查询中,我只想遍历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
分子以蓝色显示,支架以红色显示,以环数命名。我们可以看到,从mol25开始,我们有一个结构,在两个边缘距离处有一个环。
因此,我过滤了戒指数量:
MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule)
WHERE s.Num_Rings > 1
RETURN p
我们得到了同样的照片!带有单个环的支架仍然存在。更糟糕的是来了!
现在我们使用先前的查询提取不同的脚手架节点,首先不过滤环数。
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] - 。
如果有人帮忙整理出来,我会很感激。
答案 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
不要忘记,通过指定可变长度路径,路径完全有可能从mol25
到scaffold4
到scaffold1
到其他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
解释:
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
分子以蓝色显示,支架以红色显示,以环数命名。我们可以看到,从mol25开始,我们有一个结构,在两个边缘距离处有一个环。
因此,我过滤了戒指数量:
MATCH p=(:Molecule {Name: 'mol25'}) -[:hasSubstructure*1..3]- (s:Scaffold) <-[:hasSubstructure]- (:Molecule)
WHERE s.Num_Rings > 1
RETURN p
我们得到了同样的照片!带有单个环的支架仍然存在。更糟糕的是来了!
现在我们使用先前的查询提取不同的脚手架节点,首先不过滤环数。
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] - 。
如果有人帮忙整理出来,我会很感激。