Neo4j - 提取路径中节点的属性数据以及指向这些节点的关系

时间:2015-11-01 06:10:47

标签: neo4j cypher nodes relationships

我想为以下数据结构编写一个紧凑的查询。

节点n1到节点1000通过关系< rel1'连接。 每个节点n都具有属性n.name 另一个节点(只有一个存在)Q具有关系' rel2'每个节点n1具有关系属性q.value

(n1)-[rel1]->(n2)-[rel1]->(n3)--[rel1]-......->(n1000)
(Q)-[rel2]->(n1), (Q)-[rel2]->(n2),(Q)-[rel2]->(n3)....... (Q)-[rel2]->(n1000)

我想提取这些数据:按出现顺序列出的1000个名称(n.name)以及指向每个节点n的1000个q.values列表

我通过使用集合函数

来检索所有名称节点n
match p=(n)-[r:rel1*..]->(m) where  n.nodeNumber = 1 and m.nodeNumber=1000 RETURN extract(n IN nodes(p)| n.name) AS name 
ORDER BY length(p) DESC
LIMIT 1

我是否可以轻松提取指向这些节点的所有q.values?理想情况下,在一个声明中。

2 个答案:

答案 0 :(得分:1)

确保使用标签+索引快速查找开始和结束节点。 如果使用最短路径,则只能找到一条路径。

match p=shortestPath((n:Label)-[r:rel1*..]->(m:Label) 
where  n.nodeNumber = 1 and m.nodeNumber=1000 
RETURN extract(n IN nodes(p) | {name: n.name, value: head([p in (n)<-[:rel2]-() | last(nodes(p)).value]) ) AS data
ORDER BY length(p) DESC
LIMIT 1
更优雅:

match p=shortestPath((n:Label)-[r:rel1*..]->(m:Label) 
where  n.nodeNumber = 1 and m.nodeNumber=1000 
UNWIND nodes(p) as n
MATCH (n)<-[:rel2]-(q:Q)
RETURN n.name, q.value;

答案 1 :(得分:1)

只是为了纠正以前优雅的命令。 a)缺失,您需要指定要搜索的路径的长度。默认情况下,它只有15左右。我在命令中添加了1100,因为给出了1000个节点。我还将n更改为nlist,因为Neo4j抱怨n被声明两次。

更新的命令在这里:

match p=shortestPath((n:Label)-[r:rel1*..1500]->(m:Label))
where  n.nodeNumber = 1 and m.nodeNumber=1000 
UNWIND nodes(p) as nlist
MATCH (nlist)<-[:rel2]-(q:Q)
RETURN nlist.name, q.value;