我想找到所有节点序列,其名称出现在列表中,并且在它们之间的关系中具有相同的序列id。例如:基于从下面的查询构建的图表:
MERGE (a:Person { name: 'graph'})
MERGE (b:Person { name: 'server' })
MERGE (a)-[:NEXT{seqid:1}]->(b)
MERGE (c:Person { name: 'server' })
MERGE (d:Person { name: 'db'})
MERGE (c)-[:NEXT{seqid:1}]->(d)
MERGE (a1:Person { name: 'graph'})
MERGE (b:Person { name: 'db' })
MERGE (a)-[:NEXT{seqid:2}]->(b)
MERGE (c:Person { name: 'db' })
MERGE (d:Person { name: 'server'})
MERGE (c)-[:NEXT{seqid:2}]->(d)
在给定列表中查找其名称的所有节点序列,例如['graph','server','db'],其中的关系中存在相同的'seqid'属性。
即
(graph)->(server)-(db) with same seqid :1
(graph)->(db)->(server) with same seqid :1 //there can be another matching
sequence with same seqid
(graph)->(db)->(server) with same seqid :2
有没有办法只保留节点的最后序列,对每个序列说'(graph) - >(server) - >(db)'而不是像(图)那样的大序列的每个子路径 - >(服务器)或(服务器) - >(db)
请帮我解决这个问题.........
(我在嵌入模式下通过java api使用neo4j 2.3.6社区版。)
答案 0 :(得分:1)
// Get all the possible paths
MATCH path = (S:Person)-[rels:NEXT*]->(E:Person)
// Check that the property is the same
WHERE ALL( r in rels WHERE rels[0]['seqid'] = r.seqid )
RETURN rels[0]['seqid'] as seqid,
// Get an array of names
REDUCE(acc = [], n in nodes(path) | acc + [n.name])
ORDER BY seqid,
length(path)