我想为以下数据结构编写一个紧凑的查询。
节点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列表
我通过使用集合函数
来检索所有名称节点nmatch 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?理想情况下,在一个声明中。
答案 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;