spring - 相当于SDN4中的template.createRelationBetween

标签 spring neo4j spring-data-neo4j spring-data-neo4j-4

我的项目当前使用 Spring-Data-Neo4J 3.3.0,我正在尝试使用新的 4.0.0.Release 版本。 在我的代码中,我有以下代码:

neo4jTemplate.createRelationshipBetween(eltOrRel, attribute, valueClass, GraphRelationType.HAS_ATT_VALUE, true)

这段代码的等价物是什么(请在新版本的SDK中使用this method in api

更特别的是,我不知道如何为特定类创建给定类型的关系。我怎样才能用密码写出这样的作品?

@Luanne 这是我的问题的一个小例子。

类元素:

@NodeEntity
public class Element {

@GraphId
private Long id;

private int age;

private String  uuid;

@Relationship(type = "HAS_ATT_VALUE")
private Set<HasAttValue> values = new HashSet<HasAttValue>();
...

类属性:

@NodeEntity
public class Attribute {
@GraphId
private Long id;

private String attName;

和 HasAttValue 类:

@RelationshipEntity(type = "HAS_ATT_VALUE")
public class HasAttValue {

@GraphId
private Long id;

@StartNode
Element element;

@EndNode
Attribute attribute;

private String value;

public HasAttValue() {
}

public HasAttValue(Element element, Attribute attribute, String value) {
    this.element = element;
    this.attribute = attribute;
    this.value = value;
    this.element.getValues().add(this);
}

在第一种情况下,一切都像魅力一样工作,并且如您的示例所示,我有以下图表(在服务器浏览器中查看)以及我在 HAS_ATT_VALUE 关系实体上的值:

(Element)->[HAS_ATT_VALUE]->(attribute)

但我的问题是在以下情况(与以前的 SDN 配合良好)。我没有使用 HasAttValue 之前的类(class),而是:

@RelationshipEntity(type = "HAS_ATT_VALUE")
public abstract class HasAttValue<T> {

@GraphId
private Long id;

@StartNode
Element element;

@EndNode
Attribute attribute;

private T value;

public HasAttValue() {
}

public HasAttValue(Element element, Attribute attribute, T value) {
    this.element = element;
    this.attribute = attribute;
    this.value = value;
    this.element.getValues().add(this);
}

例如有两个子类。 第一个:

public class HasBooleanValue extends HasAttValue<Boolean> {

public HasBooleanValue() {
}

public HasBooleanValue(Element elt, Attribute attribut, Boolean value) {
    super(elt, attribut, value);
}
}

第二个:

public class HasStringValue extends HasAttValue<String> {

private String locale;

public HasStringValue() {
}

public HasStringValue(Element element, Attribute attribut, String value)   {
    super(element, attribut, value);
}

在这种情况下,图表如下所示:

(element)->[HAS_ATT_VALUE]->(HasBooleanValue|HasStringValue)->[ATTRIBUTE]->(Attribute)

和图中的另一个弧线 (元素)<-[元素]-(HasBooleanValue|HasStringValue)

那么我怎样才能始终拥有(element)->[HAS_ATT_VALUE]->(attribute),其中“has_att_value”是包含数据但在我的java代码中具有不同实现的关系实体?同样,当我使用 neo4jTemplate.createRelationshipBetween(eltOrRel, attribute, valueClass, GraphRelationType.HAS_ATT_VALUE, true) 创建我的“hasAttValue”关系实体时,这在 SDN3 中运行良好。

非常感谢

最佳答案

在 SDN 4.0 中,不需要使用 Neo4jTemplate 方法显式创建关系。保留定义@Relationships 的实体就足以create relationships 。如果您在关系上有属性,那么您需要 @RelationshipEntity

可以在此处找到 SDN 4.0 中对象模型的说明 http://graphaware.com/neo4j/2015/09/03/sdn-4-object-model.html

根据 @clement 提供的附加信息进行更新:

例如,只需将 @RelationshipEntity 注释从 HasAttValue移动到每个子类即可

@RelationshipEntity(type = "HAS_ATT_VALUE")
public class HasBooleanValue extends HasAttValue<Boolean> {

请注意,您将需要最新的 OGM 快照,因为围绕抽象关系实体的问题刚刚得到解决。请使用

  <dependency>
       <groupId>org.neo4j</groupId>
       <artifactId>neo4j-ogm</artifactId>
       <version>1.1.3-SNAPSHOT</version>
  </dependency>
 <repository>
       <id>neo4j-snapshots</id>
       <url>http://m2.neo4j.org/content/repositories/snapshots</url>
       <snapshots>
           <enabled>true</enabled>
       </snapshots>
  </repository> 

或者使用SDN 4.1快照

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-neo4j</artifactId>
    <version>4.1.0.BUILD-SNAPSHOT</version>
</dependency>

那么你的图表应该看起来像

enter image description here

直接使用 Cypher 不是一个好主意,因为您必须能够查找节点(可能通过 ID),这意味着必须首先保存它们。

关于spring - 相当于SDN4中的template.createRelationBetween,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32694961/

相关文章:

java - 删除/清除测试系列的 Neo4j DB

json - 无法初始化代理 - 无 session

java - 当 @Embedded 字段的所有列均为 NULL(JPA/Hibernate)时 - 如何防止空指针?

neo4j - 将现有数据库导入 Neo4j 桌面应用程序 (v1.1.9)

neo4j - 编写自定义 Neo4j 记录插入器

neo4j - Spring Data Neo4j - 如何让 WrappingNeoServerBootstrapper 监听 0.0.0.0

javascript - 更新前验证字段

java - Spring Boot @ControllerAdvice 异常处理程序不返回 HTTP 状态文本

stored-procedures - Neo4J/APOC - 调用存储过程 `apoc.cypher.doIt` 后无法构建查询

spring - RabbitMQ Spring Boot session 错误