2016-08-18 144 views
0

我想查找名称出现在列表中并具有相同序列标识的相同序列标识的所有节点序列。对于如:基于从下面的查询构造图:neo4j cypher查询获得关系属性中具有相同序列标识的节点序列

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) 

找到与他们在给定列表中的名称节点的所有序列,说[“图”,“服务器”,“数据库”]有相同的“ 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 

有一种只保留节点的最终序列说“(曲线) - >(服务器) - >(分贝)”对于每个序列,而不是每个子路径的大序列像(图) - >(服务器)或(服务器) - >(DB)

请帮助我解决这个.........

(我用的Neo4j 2.3 .6社区版通过java api在嵌入模式下..)

回答

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) 
+0

有没有一种方法可以保留每个序列的最终序列节点,如'(图) - >(服务器) - >(db)',而不是像(图) - >大序列的每个子路径(服务器)或(服务器) - >(db) –

相关问题