我代表人发送的短信。为了简化问题,我只有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。
我无法理解第一个查询的结果集(零元组)。
答案 0 :(得分:0)
Cypher只会在尝试遍历路径时遍历特定关系,以避免无限循环。您已经在查询中遍历(p1:Person) - [:HAS] - > (n1:Phone)
关系一次,因此您无法通过手机返回Juana。但是,这不适用于节点,这就是为什么你可以从循环[:sms]
关系中获取两次电话的原因。