Cypher Query不起作用

时间:2016-10-10 18:36:12

标签: cypher

我代表人发送的短信。为了简化问题,我只有2个节点(一个人,一个电话)和3个关系(这个人有一个电话并向自己发送了两条短信)。该图表创建如下:

try ( Transaction tx = graphDb.beginTx() )
{
Node aNode1 = graphDb.createNode();
aNode1.addLabel(DynamicLabel.label("Person"));
aNode1.setProperty("Name", "Juana");
tx.success();

Node aNode2 = graphDb.createNode();
aNode2.addLabel(DynamicLabel.label("Phone"));
aNode2.setProperty("Number", "1111-1111");
tx.success();

// (:Person) -[:has]->(:Phone)
aNode1.createRelationshipTo(aNode2, RelationshipType.withName("has"));
tx.success();


// finally SMS text sent at different moments
// (:Phone) -[:sms]-> (:Phone)
Relationship rel1 = aNode2.createRelationshipTo(aNode2, RelationshipType.withName("sms"));
rel1.setProperty("Length", 100);
tx.success();

Relationship rel2 = aNode2.createRelationshipTo(aNode2, RelationshipType.withName("sms"));
rel2.setProperty("Length", 50);
tx.success();

}

当我执行以下Cypher查询时:

MATCH  (p1 :Person)-[:has]-> (n1 :Phone) -[r :sms]-(n2: Phone)<-[:has]-(p2 :Person)
RETURN p1, p2

我获得零元组。我不理解结果集,因为我必须在p1和p2之间发短信(在这种情况下是同一个人)。

令人惊讶的是,如果我在查询中删除了节点p2:

MATCH  (p1 :Person)-[:has]-> (n1 :Phone) -[r :sms]-(n2: Phone)
RETURN p1

我按照预期获得了Juana。

我无法理解第一个查询的结果集(零元组)。

1 个答案:

答案 0 :(得分:0)

Cypher只会在尝试遍历路径时遍历特定关系,以避免无限循环。您已经在查询中遍历(p1:Person) - [:HAS] - > (n1:Phone)关系一次,因此您无法通过手机返回Juana。但是,这不适用于节点,这就是为什么你可以从循环[:sms]关系中获取两次电话的原因。