今天我尝试了Spring Data Neo4j,我终于让它工作了...
我正在使用:
这是我的配置:
@Configuration
@EnableNeo4jRepositories(includeFilters=@Filter(value=GraphRepository.class, type=FilterType.ASSIGNABLE_TYPE))
public class Neo4jConfig extends Neo4jConfiguration {
public Neo4jConfig() {
setBasePackage("my.base.package");
}
@Bean
public GraphDatabaseService graphDatabaseService() {
return new GraphDatabaseFactory().newEmbeddedDatabase("/tmp/neo4j");
}
}
我的域名类:
@NodeEntity
@QueryEntity
public class User implements Persistable<Long> {
@GraphId private Long id;
public Long getId() { return id; }
@NotNull @NotBlank @Email
@Indexed(unique=true)
private String email;
public String getEmail() { return email; }
void setEmail(String email) { this.email = email; }
@Override
public boolean isNew() {
return id==null;
}
@Override
public int hashCode() {
return id == null ? System.identityHashCode(this) : id.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
和我的仓库:
interface UserRepository extends GraphRepository<User>, CypherDslRepository<User> {}
我可以在DB中成功创建一个用户,然后通过以下方式检索该用户:
User u = repo.query(
start(allNodes("user"))
.where(toBooleanExpression(QUser.user.email.eq("my@email.com")))
.returns(node("user")), new HashMap<String, Object>())
.singleOrNull();
但是:如果我现在再次调用我的create代码,它不会抛出异常,因为@index(unique=true)字符串email
,它只会覆盖数据库中的对象。
并且:如果我尝试创建另一个具有不同电子邮件值的用户
,则会覆盖旧用户get。
创建代码非常简单,如下所示:
User u = new User();
u.setEmail("some@email-address.com");
repo.save(u);
我还尝试使用Neo4j的独立版,而不是嵌入式的,结果完全相同。在webadmin视图中,我可以看到,它创建了一些索引:
Node Indexes: Relationship Indexes:
User {"type":"exact"} __rel_types__ {"type":"exact"}
lucene lucene
调试输出还告诉我Spring创建了一个索引:
2014-03-12 21:00:34,176 DEBUG o.s.data.neo4j.support.schema.SchemaIndexProvider: 35 - CREATE CONSTRAINT ON (n:`User`) ASSERT n.`email` IS UNIQUE
2014-03-12 21:00:34,177 DEBUG o.s.data.neo4j.support.query.CypherQueryEngine: 63 - Executing cypher query: CREATE CONSTRAINT ON (n:`User`) ASSERT n.`email` IS UNIQUE params {}
更多调试输出:
curl -v http://localhost:7474/db/data/index/node
{
"User" : {
"template" : "http://localhost:7474/db/data/index/node/User/{key}/{value}",
"provider" : "lucene",
"type" : "exact"
}
curl -v http://localhost:7474/db/data/schema/index
[ {
"property_keys" : [ "email" ],
"label" : "User"
} ]
curl -v http://localhost:7474/db/data/schema/constraint
[ {
"property_keys" : [ "email" ],
"label" : "User",
"type" : "UNIQUENESS"
} ]
我真的无法想象我在这里做错了什么。。。
请帮帮我!
更新#1:
从我在AbstractGraphRespository中看到的内容。保存
它使用Neo4jTemplate。保存
,其中说明:
Stores the given entity in the graph, if the entity is already attached to the graph, the node is updated, otherwise a new node is created.
所以我假设它总是“认为”我的实体已经被连接。但是为什么呢?
更新#2:
如果我转到webadmin并只执行两次:
CREATE (n:User {email:'test@mail.com'})
我犯了一个错误。所以我的Java代码或SDN肯定有问题。。。
更新#3:
Spring Data Neo4j的保存
方法执行类似GET或CREATE的操作:
User u1 = new User();
u1.setEmail("a@email.com");
repo.save(u1); // creates node with id=0
User u2 = new User();
u2.setEmail("b@email.com");
repo.save(u2); // creates node with id=1
User u3 = new User();
u3.setEmail("a@email.com");
repo.save(u3); // updates and returns node with id=0
如何修复此行为?我想要一个例外。
更新#4:
好像我在找那个:http://docs.neo4j.org/chunked/stable/rest-api-unique-indexes.html#rest-api-create-a-unique-node-or-return-fail-create
Map<String, Object> prop1 = new HashMap<String, Object>();
prop1.put("email", "abc@mail.com");
neo4jTemplate.createNodeAs(User.class, prop1);
Map<String, Object> prop2 = new HashMap<String, Object>();
prop2.put("email", "abc@mail.com");
neo4jTemplate.createNodeAs(User.class, prop2);
通过这种方式,它可以按预期工作,至少我得到了一个例外:
org.neo4j.rest.graphdb.RestResultException: Node 7 already exists with label User and property "email"=[abc@mail.com]
但现在我不知道如何将它与Spring数据存储库集成。。。
如果您使用的是SDN 3.2.0,请使用故障复制属性:
@Indexed(unique = true, failOnDuplicate = true)
CreateIndexes 根据struct中的tag来创建索引 CreateUniques 根据struct中的tag来创建唯一索引
以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。
我创建下表: 我的问题是我是否需要这句话: ? 是否自动对创建索引?
问题内容: 就性能而言,MySQL唯一索引和非唯一索引有什么区别? 假设我要在2列的组合上创建索引,并且该组合是唯一的,但是我创建了一个非唯一的索引。这会对MySQL使用的性能或内存产生重大影响吗? 同样的问题, 主 键和 唯一 索引之间有区别吗? 问题答案: UNIQUE和PRIMARY KEY是 约束 ,而不是索引。尽管大多数数据库通过使用索引来实现这些约束。除了索引之外,约束的额外开销也微不
本文向大家介绍MySQL普通索引和唯一索引的深入讲解,包括了MySQL普通索引和唯一索引的深入讲解的使用技巧和注意事项,需要的朋友参考一下 场景 1、维护一个市民系统,有一个字段为身份证号 2、业务代码能保证不会写入两个重复的身份证号(如果业务无法保证,可以依赖数据库的唯一索引来进行约束) 3、常用SQL查询语句:SELECT name FROM CUser WHERE id_card = 'XX
我构建了一个REST服务,发现使用Gson从ObjectId生成的JSON字符串的格式与Spring-Boot生成的格式不同。如果我以GSON格式将现有文档的_id字段的ObjectId发送到REST服务,并使用MongoRepository的save函数将其保存到集合中,即使在这样的字段上设置了唯一的索引,仍会插入具有duplicated_id的新文档。但是,如果我以spring-boot生成的