当使用可变长度标识符时,是否有办法仅保留或返回最后的完整节点序列而不是所有子路径,以便在每个最终完整序列路径上执行进一步操作。
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社区版。)
答案 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