Neo4J从路径中的节点获取节点

Neo4J从路径中的节点获取节点,neo4j,cypher,Neo4j,Cypher,这在某种程度上与这个问题有关,但并不完全相同: 与上一个问题一样,我有一个类似的设置: (a)-->(b)-->(c)-->(d) ^ ^ ^ ^ |r |r |r |r (aa) (bb) (cc) (dd) 创建示例(请参见控制台): 假设我有aas 7和das 4。我会得到这样的路径: START a=node(7), d=node(4) MATCH path = a-[:rel1*]->d RETURN p

这在某种程度上与这个问题有关,但并不完全相同:

与上一个问题一样,我有一个类似的设置:

(a)-->(b)-->(c)-->(d)
 ^     ^     ^     ^
 |r    |r    |r    |r
(aa)  (bb)  (cc)  (dd)
创建示例(请参见控制台):

假设我有
a
as 7和
d
as 4。我会得到这样的路径:

START a=node(7), d=node(4) 
MATCH path = a-[:rel1*]->d 
RETURN path
我想要的是aa、bb、cc和dd


我被难住了。

好吧,我花了点时间才明白过来

START n=node(*), a=node(1), z=node(4) 
MATCH path = a-[:rel1*]->z 
WITH n, path 
MATCH n-[:r]->o 
WHERE n IN path 
RETURN o
虽然它看起来确实很慢,但我想可能有更好的方法

输出:

o
(5 {name:"aa"})
(6 {name:"bb"})
(7 {name:"cc"})
(8 {name:"dd"})
编辑: yhw42提到,如果这样修改,查询可以运行得更快:

START a=node(1), z=node(4) 
MATCH path = a-[:rel1*]->z 
WITH path 
MATCH n-[:r]->o 
WHERE n IN path 
RETURN o
在样本中,确实如此。我的方式是:

Query Results

+--------------------+
| o                  |
+--------------------+
| Node[5]{name:"aa"} |
| Node[6]{name:"bb"} |
| Node[7]{name:"cc"} |
| Node[8]{name:"dd"} |
+--------------------+
4 rows
344 ms

Execution Plan

ColumnFilter(symKeys=["n", "path", "o", "  UNNAMED88"], returnItemNames=["o"], _rows=4, _db_hits=0)
PatternMatch(g="(n)-['  UNNAMED88']-(o)", _rows=4, _db_hits=0)
  Filter(pred="any(-_-INNER-_- in path where n == -_-INNER-_-)", _rows=4, _db_hits=0)
    ColumnFilter(symKeys=["path", "n", "a", "  UNNAMED53", "z"], returnItemNames=["n", "path"], _rows=9, _db_hits=0)
      ExtractPath(name="path", patterns=["  UNNAMED53=a-[:rel1*]->z"], _rows=9, _db_hits=0)
        PatternMatch(g="(a)-['  UNNAMED53']-(z)", _rows=9, _db_hits=0)
          NodeById(name="Literal(List(4))", identifier="z", _rows=9, _db_hits=9)
            NodeById(name="Literal(List(1))", identifier="a", _rows=9, _db_hits=9)
              AllNodes(identifier="n", _rows=9, _db_hits=9)
他的方式是:

Query Results

+--------------------+
| o                  |
+--------------------+
| Node[5]{name:"aa"} |
| Node[6]{name:"bb"} |
| Node[7]{name:"cc"} |
| Node[8]{name:"dd"} |
+--------------------+
4 rows
174 ms

Execution Plan

ColumnFilter(symKeys=["path", "n", "o", "  UNNAMED74"], returnItemNames=["o"], _rows=4, _db_hits=0)
PatternMatch(g="(n)-['  UNNAMED74']-(o)", _rows=4, _db_hits=0)
  Filter(pred="any(-_-INNER-_- in path where n == -_-INNER-_-)", _rows=4, _db_hits=0)
    AllNodes(identifier="n", _rows=9, _db_hits=9)
      ColumnFilter(symKeys=["a", "z", "  UNNAMED42", "path"], returnItemNames=["path"], _rows=1, _db_hits=0)
        ExtractPath(name="path", patterns=["  UNNAMED42=a-[:rel1*]->z"], _rows=1, _db_hits=0)
          PatternMatch(g="(a)-['  UNNAMED42']-(z)", _rows=1, _db_hits=0)
            NodeById(name="Literal(List(4))", identifier="z", _rows=1, _db_hits=1)
              NodeById(name="Literal(List(1))", identifier="a", _rows=1, _db_hits=1)

您应该能够从START子句中删除
n=node(*)
,并从中删除
n
,只在第二个匹配项和WHERE中保留n。这有速度上的差别吗?我的速度是344米,你的速度是174米。超小的数据集,所以我觉得很有意义。
Query Results

+--------------------+
| o                  |
+--------------------+
| Node[5]{name:"aa"} |
| Node[6]{name:"bb"} |
| Node[7]{name:"cc"} |
| Node[8]{name:"dd"} |
+--------------------+
4 rows
174 ms

Execution Plan

ColumnFilter(symKeys=["path", "n", "o", "  UNNAMED74"], returnItemNames=["o"], _rows=4, _db_hits=0)
PatternMatch(g="(n)-['  UNNAMED74']-(o)", _rows=4, _db_hits=0)
  Filter(pred="any(-_-INNER-_- in path where n == -_-INNER-_-)", _rows=4, _db_hits=0)
    AllNodes(identifier="n", _rows=9, _db_hits=9)
      ColumnFilter(symKeys=["a", "z", "  UNNAMED42", "path"], returnItemNames=["path"], _rows=1, _db_hits=0)
        ExtractPath(name="path", patterns=["  UNNAMED42=a-[:rel1*]->z"], _rows=1, _db_hits=0)
          PatternMatch(g="(a)-['  UNNAMED42']-(z)", _rows=1, _db_hits=0)
            NodeById(name="Literal(List(4))", identifier="z", _rows=1, _db_hits=1)
              NodeById(name="Literal(List(1))", identifier="a", _rows=1, _db_hits=1)