在密码中返回部分匹配

时间:2015-03-27 16:33:17

标签: neo4j match cypher partial

您好我正在使用此查询返回三个起始节点的公共子节点。

MATCH (c1:node)-[*]->(x), (c2:node)-[*]->(x), (c3:node)-[*]->(x)
USING INDEX c1:node(name)
USING INDEX c2:node(name)
USING INDEX c3:node(name)
WHERE c1.name = "Tobin" AND c2.name ="John" AND c3.name ="Clarke"
RETURN DISTINCT x

目前除非所有三个节点都有一个公共子节点,否则它不会返回任何内容。我怎么能让它返回部分匹配,说托宾和约翰有一个共同的孩子克拉克没有?

理想情况下,在这种情况下,我会单独让它返回Clarke的第一个孩子,即使它与其他人不匹配......但也许我从一个查询中要求太多了?

谢谢!

1 个答案:

答案 0 :(得分:0)

它有点难,因为任何3个节点中的任何一个孩子都会匹配这个条件。所以你在那里创造的是一个交叉产品。

在Neo4j 2.2.0中你可以试试这个:

MATCH (c1:node),(c2:node), (c3:node)
USING INDEX c1:node(name)
USING INDEX c2:node(name)
USING INDEX c3:node(name)
WHERE c1.name = "Tobin" AND c2.name ="John" AND c3.name ="Clarke"
MATCH (c1)-[*]->(x)
WHERE shortestPath((c2)-[*]->(x)) oR shortestPath((c3)-[*]->(x))
RETURN DISTINCT x