neo4j cypher查询获取关系属性

时间:2016-08-18 12:38:31

标签: neo4j cypher

我想找到所有节点序列,其名称出现在列表中,并且在它们之间的关系中具有相同的序列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社区版。)

1 个答案:

答案 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)
相关问题