Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 根据链接节点的信息选择路径_Neo4j_Cypher_Graph Databases - Fatal编程技术网

Neo4j 根据链接节点的信息选择路径

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

我有以下问题: 我想选择类型为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
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,更正了上面的代码