2016-08-20 16 views
0

当使用变量长度标识符进行更深层次的操作时,是否有方法保留或仅返回最终的全部节点序列而不是所有子路径每个最终全序列路径上的操作。密码查询返回或仅保留使用可变长度关系标识符时的最终序列

MATCH路径=(S:人) - [RELS:NEXT *] - >(E:人)................

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

(图形) - >(服务器) - (分贝)与相同SEQID:1

(图形) - >(分贝) - >(服务器)具有相同SEQID:1 //可以有另一个匹配
序列具有相同SEQID

(图) - >(DB) - >(服务器)具有相同的SEQID:2

有没有办法只保留节点的最终序列说'(图) - >(服务器) - >(db)'代替每个序列>(服务器)或(服务器) - - 样(图)大序列的子路径>(DB)

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

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

+0

您可以共享是Cypher支架查询匹配所有序列? – InverseFalcon

+0

另外,如果可以通过多个有效路径到达同一个端点节点,您是否有任何要求?此外,我没有看到S被视为一些独特的开始节点,它在所有:Person节点上匹配。这种查询是否适用于所有人:人员,还是来自单个(或一组)开始节点? – InverseFalcon

+0

假设您希望您的起始节点没有传入:NEXT关系是否公平?如果不是,应该使用什么样的标准来确定序列的起始节点? – InverseFalcon

回答

1

我们真的可以在这里使用的是一个longestSequences()函数,它可以完成您想要的操作,扩展模式,使a和b将始终与序列中的开始点和结束点匹配,以使模式不是任何其他匹配模式的子集。

我创建正是这种对Neo4j的功能要求:https://github.com/neo4j/neo4j/issues/7760

而且直到得到实施,我们将不得不凑合着用一些替代方法。我认为我们要做的就是添加额外的匹配,将a和b限制为完整序列的开始和结束节点。

这是我提出的查询:

WITH ['graph', 'server' ,'db'] as names 
MATCH p=(a)-[rels:NEXT*]->(b) 
WHERE ALL(n in nodes(p) WHERE n.name in names) 
AND ALL(r in rels WHERE rels[0]['seqid'] = r.seqid) 
WITH names, p, a, rels, b 
// check if b is a subsequence node instead of an end node 
OPTIONAL MATCH (b)-[rel:NEXT]->(c) 
WHERE c.name in names 
AND rel.seqid = rels[0]['seqid'] 
// remove any existing matches where b is a subsequence node 
WITH names, p, a, rels, b, c 
WHERE c IS NULL 
WITH names, p, a, rels, b 
// check if a is a subsequence node instead of a start node 
OPTIONAL MATCH (d)-[rel:NEXT]->(a) 
WHERE d.name in names 
AND rel.seqid = rels[0]['seqid'] 
// remove any existing matches where a is a subsequence node 
WITH p, a, b, d 
WHERE d IS NULL 
RETURN p, a as startNode, b as endNode 
+0

非常感谢您的帮助....但是请帮助......它不会捕获那些以相同seqid ..i.e出现的顺序。如果(图) - >(服务器) - >(数据库)与seqid 2和(数据库) - >(图) - >(服务器)相同的seqid 2是否存在,那么它不会显示两个。如果可能请帮助我。 –

+0

在你的评论中,这两个序列(图形 - >服务器 - >数据库,数据库 - >图形 - >服务器)是分开的,还是你说的重叠(其中实际序列是db-> graph-> server-> db和你需要匹配内部两个不同的序列?另外,你能否澄清你想查找的序列是否应该包含给定名称列表中的名称的节点(所以server-> server-> server会好的),或者如果你正在查找给定名称列表中每个名称中只有一个名称的序列,则不会重复? – InverseFalcon

+0

(图形 - >服务器 - > db,db->图形 - >服务器)是单独的.. –

0

将帖子

此查询可能会做你想要什么:

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值。然后,它从每个p1节点开始并且具有全部共享相同seqid的关系,找到所有“完整”路径(即其开始和结束节点分别与期望的seqid没有呼入或呼出关系的路径)。最后,它返回每个完整的路径。

如果你只是想获得的所有Person节点的name财产的每个路径,尝试此查询(用不同的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); 
+1

这可能会工作,只要开始和结束节点定义为没有:根据什么是NEXT关系在这里,如果是这种情况,这绝对是最好的解决方案的开始(仍然需要在那里的名称限制)。但是,如果可以有:NEXT与起始和结束节点之间的关系,但是具有不同的seqids,或者甚至具有相同的seqid,但从/到具有我们不关心的名称的节点,我们需要更强大的查询。 – InverseFalcon

+0

我编辑了我的答案,以考虑我认为是来自@InverseFalcon的有效评论。 – cybersam

+0

请帮助...我只想要选择的元素列表的序列... ['图','服务器','数据库],可以以任何顺序发生相同的seqid或不同 –

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

请求帮助...我只想要选择的元素列表... ['图表','服务器','数据库]的序列,可以以任何顺序出现相同的seqid或不同的 –