我的项目目前使用的是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是什么?
尤其是我不知道如何为特定类创建给定类型的关系。我怎样才能在cypher中写这样的创作?
@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 relationshipEntity上:
(Element)->[HAS_ATT_VALUE]->(attribute)
但我的问题是在以下情况下(与以前的SDN一起运行良好)。我没有HasAttValue上一课,而是:
@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)
和格拉夫的另一个弧线 (元件)LT - [ELEMENT] - (HasBooleanValue | HasStringValue)
那么如何才能始终拥有(元素) - &gt; [HAS_ATT_VALUE] - &gt;(属性)其中“has_att_value”是包含数据但在我的java代码中具有不同实现的关系密钥?再次,当我使用neo4jTemplate.createRelationshipBetween(eltOrRel,attribute,valueClass,GraphRelationType.HAS_ATT_VALUE,true)来创建我的“hasAttValue”relationshipEntity时,这在SDN3中运行良好。
非常感谢
答案 0 :(得分:3)
在SDN 4.0中,不需要使用Neo4jTemplate方法显式创建关系。持久定义@Relationships的实体足以create relationships。如果您有关系的属性,那么您需要@RelationshipEntity。
可以在http://graphaware.com/neo4j/2015/09/03/sdn-4-object-model.html
中找到SDN 4.0中对象模型的说明根据@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>
然后你的图表看起来像
直接使用Cypher并不是一个好主意,因为您必须能够查找节点(可能是ID),这意味着必须先保存它们。