cypher查询在使用可变长度关系标识符时返回或仅保留最终序列

时间:2016-08-20 17:23:26

标签: neo4j cypher

当使用可变长度标识符时,是否有办法仅保留或返回最后的完整节点序列而不是所有子路径,以便在每个最终完整序列路径上执行进一步操作。

MATCH path =(S:Person) - [rels:NEXT *] - >(E:Person)................

例如:查找给定列表中名称的所有节点序列,例如['graph','server','db'],其间的关系中存在相同的'seqid'属性。

(图) - >(服务器) - (db)具有相同的seqid:1

(图) - >(db) - >(服务器)具有相同的seqid:1 //可以有另一个匹配的
                                                        具有相同seqid的序列

(图) - >(db) - >(服务器)具有相同的seqid:2

有没有办法只保留节点的最后序列,对每个序列说'(graph) - >(server) - >(db)'而不是像(图)那样的大序列的每个子路径 - >(服务器)或(服务器) - >(db)

请帮我解决这个问题.........

(我在嵌入模式下通过java api使用neo4j 2.3.6社区版。)

3 个答案:

答案 0 :(得分:1)

我们真正可以使用的是一个longestSequences()函数,它可以完全按照您的意愿执行,扩展模式,使a和b始终匹配序列中的起点和终点,以便模式不是任何其他匹配模式的子集。

我在neo4j上创建了一个功能请求:https://github.com/neo4j/neo4j/issues/7760

在实施之前,我们必须采取一些替代方法。我认为我们必须做的是添加额外的匹配来限制a和b来开始和结束完整序列的节点。

这是我提出的问题:

l1

答案 1 :(得分:0)

[EDITED]

此查询可能会执行您想要的操作:

MATCH (p1:Person)-[rel:NEXT]->(:Person)
WHERE NOT (:Person)-[:NEXT {seqid: rel.seqid}]->(p1)
WITH DISTINCT p1, rel.seqid AS seqid
MATCH path = (p1)-[:NEXT* {seqid: seqid}]->(p2:Person)
WHERE NOT (p2)-[:NEXT {seqid: seqid}]->(:Person)
RETURN path;

它首先标识所有Person个节点(p1),其中至少有一个外发NEXT关系没有传入NEXT关系(具有相同的seqid} ),以及它们不同的传出seqid值。然后它找到所有“完整”路径(即,其开始和结束节点分别与所需NEXT没有传入或传出seqid关系的路径)从每个p1节点开始并具有关系全部共享seqid。最后,它返回每个完整的路径。

如果您只想获取每个路径中所有name个节点的Person属性,请尝试此查询(使用不同的RETURN子句):

MATCH (p1:Person)-[rel:NEXT]->(:Person)
WHERE NOT (:Person)-[:NEXT {seqid: rel.seqid}]->(p1)
WITH DISTINCT p1, rel.seqid AS seqid
MATCH path = (p1)-[:NEXT* {seqid: seqid}]->(p2:Person)
WHERE NOT (p2)-[:NEXT {seqid: seqid}]->(:Person)
RETURN EXTRACT(n IN NODES(path) | n.name);

答案 2 :(得分:0)

MATCH (S:Person)-[r:NEXT]->(:Person) 
    // Possible starting node
    WHERE NOT ( (:Person)-[:NEXT {seqid: r.seqid}]->(S) )
WITH S, 
     // Collect all possible values of `seqid`
     collect (distinct r.seqid) as seqids
UNWIND seqids as seqid
// Possible terminal node
MATCH (:Person)-[r:NEXT {seqid: seqid}]->(E:Person) 
    WHERE NOT ( (E)-[:NEXT {seqid: seqid}]->(:Person) )
WITH S, 
     seqid, 
     collect(distinct E) as ES
UNWIND ES as E
    MATCH path = (S)-[rels:NEXT* {seqid: seqid}]->(E) 
RETURN S, 
       seqid, 
       path