如果不存在,如何使用SDN创建节点?

时间:2014-03-11 08:23:52

标签: java neo4j spring-data-neo4j

使用SDN Neo4j,只有当具有匹配字段的节点不存在时才可以创建节点吗?因此,例如,我有一个现有节点,可以说标记为“Road”,其值为“N4”。现在我需要创建一个与该节点有关系的新节点,让我们说“驱动器开启”。所以我这样做很好。但是第二次我需要检查标签为“Road”的节点是否已经存在且值为“N4”。如果是,则使新节点指向现有节点,而不是创建值为N4的新Road节点?

我正在尝试使用SDN做相同的事情我认为:

MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[:X]-(leaf { name:'D' })
RETURN leaf

与根节点连接的节点没有名称D,因此创建了一个新节点以匹配模式。

这可以通过某种方式在插入点使用SDN域建模来完成吗?

感谢

2 个答案:

答案 0 :(得分:1)

一般情况下,根据需要创建道路可能不是一个好主意吗?

实际上很简单

class Road {
  @Indexed(unique=true) String name;
}

class Person {
  @Indexed(unique=true) String name;
  Road drivesOn;
}

Road r = template.save(new Road("N4")); // does a merge if the road already exists, but of course more expensive

Person p = new Person("Timmy")
p.setDrivesOn(r);

// also merges person if it doesn't exist, 
// the default is that there is only one relationship ever between this person and _a_ road.

template.save(p); 

答案 1 :(得分:0)

为什么不使用自定义存储库类?您可以重新使用您的密码查询。

public interface LeafRepository extends GraphRepository<Leaf> {

    @Query("MATCH (r:{0}) CREATE UNIQUE (r)-[:X]-(leaf { name:'D' }) RETURN leaf")
    Leaf createLeaf(Road road);

}

自从我使用SDN已经有一段时间了,但主要想法应该是明确的。如果你想使用Neo4j 2.0,你将不得不使用SDN 3。有关详细信息,请阅读repository tutorial