Neo4j 根据链接节点的信息选择路径
我有以下问题: 我想选择类型为A的路径节点。但我不想要所有路径,只想要具有特定属性的路径。问题是,在我们的数据模型中,这些属性存储在AD类型的单独节点中。对于开始和结束,一切正常。我想我也已经计算出了一般结构,因为这里的查询工作得非常好Neo4j 根据链接节点的信息选择路径,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我有以下问题: 我想选择类型为A的路径节点。但我不想要所有路径,只想要具有特定属性的路径。问题是,在我们的数据模型中,这些属性存储在AD类型的单独节点中。对于开始和结束,一切正常。我想我也已经计算出了一般结构,因为这里的查询工作得非常好 MATCH (n:A)-->(ad:AD) WHERE ad.name='AD0' WITH n AS start MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3' WITH n AS end, start MATC
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD0'
WITH n AS start
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3'
WITH n AS end, start
MATCH p = (start) -[:L*0..10]-> (end)
WHERE ALL (x in nodes(p) [1..-1] WHERE ( (x.name STARTS WITH 'ad1' OR x.name STARTS WITH 'ad2')))
return p
这里的问题是,我从类型A的节点中获取中间节点的属性,这在我们的最终模型中是不可能的。为了进行测试,我在a中添加了一个属性,其中包含通常存储在AD中的信息
结果应仅包含链接到AD类型节点的A类型节点,并且AD.name应为AD0。。。AD3,但我想排除类型A的节点,例如,使用AD.name='AD4'链接到AD节点。
为此,我尝试了以下查询,但它只返回包含链接到AD.name=AD0或AD3的节点AD的节点的路径
MATCH (n:A)-->(ad:AD WHERE ad.name='AD0'
WITH n AS start
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3'
WITH n AS end, start
MATCH (n:AD) WITH n AS ad, end, start //somehow needed otherwise I cannot use AD in the where clause
MATCH p = (start) -[:L*0..]-> (end)
WHERE ALL (
x in nodes(p) [1..-1] WHERE (
((x)-->(ad:AD))
AND
(ad.name ='AD1' OR ad.name='AD2')
)
)
return p
知道为什么只包含链接到AD.name=AD1或AD2的AD类型节点的A类型节点的路径没有返回吗?我能够解决这个问题。不知道是否有更好的方法,但我必须将我的中间节点放在一个单独的列表中,否则我无法在where ALL子句的where部分使用它。工作代码如下所示:
MATCH (n:A)-->(ad:AD WHERE ad.name='AD0'
WITH n AS start
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3'
WITH n AS end, start
MATCH (n:A)-->(ad:AD) WHERE (ad.name IN ['AD1', 'AD2'])
WITH collect(n) AS intermediates, sinks, sources
MATCH p = (start) -[:L*0..]-> (end)
WHERE ALL (
x IN nodes(p) [1..-1] WHERE (
x IN intermediates
)
)
return p
我能解决这个问题。不知道是否有更好的方法,但我必须将我的中间节点放在一个单独的列表中,否则我无法在where ALL子句的where部分使用它。工作代码如下所示:
MATCH (n:A)-->(ad:AD WHERE ad.name='AD0'
WITH n AS start
MATCH (n:A)-->(ad:AD) WHERE ad.name='AD3'
WITH n AS end, start
MATCH (n:A)-->(ad:AD) WHERE (ad.name IN ['AD1', 'AD2'])
WITH collect(n) AS intermediates, sinks, sources
MATCH p = (start) -[:L*0..]-> (end)
WHERE ALL (
x IN nodes(p) [1..-1] WHERE (
x IN intermediates
)
)
return p
第一件事:在
行中,将(n:AD)与n匹配为AD、sinks、sources
您没有将start
和end
传递到下一个上下文。我认为您应该将此行更改为MATCH(n:AD)WITH n AS AD,sinks,sources,start,end
,然后重试。抱歉,出现了混乱,sinks sources现在是start end,更正了上面的代码第一件事:在行MATCH(n:AD)WITH n AS AD,sinks,sources
您没有将开始
和结束
传递到下一个上下文。我认为您应该将此行更改为将(n:AD)与n匹配为AD、sinks、sources、start、end
,然后重试。很抱歉,出现了混淆,sinks-sources现在是start-end,更正了上面的代码