关系属性未在图

时间:2015-06-18 13:34:03

标签: spring-data-neo4j

上下文

  • SDN 3.3.0.RELEASE / 3.4.0.M1
  • 远程服务器模式下的Neo4j 2.1.7。

用例

我在数据库中有一个现有的Person,它可以有多个可以使用多种语言的PersonTranslatedContent。 基本上,我的模型化就像:

(:Person)-[:TRANSLATION {lang:"fr}]->(:PersonTranslatedContent)

问题

当我创建一个PersonTranslatedContent节点和一个TRANSLATION关系以与我的Person链接时,' lang'财产不是持久的关系。 核心创建了节点,但是当我从Neo4j浏览器查询数据库时,我的关系只有一个属性:_type__ : PersonToPersonTranslatedContent

分析

当记录Neo4j收到的HTTP请求时,执行的请求按以下顺序进行:

 1. MATCH (n) WHERE id(n) = {id_n}  MATCH (m) WHERE id(m) = {id_m}  CREATE (n)-[r:`TRANSLATION`]->(m) SET r={props}  RETURN id(r) as id, type(r) as type, r as properties, id(startNode(r)) as start, id(endNode(r)) as end
 2. START r=rel({id})  SET r.`_ _type_ _` = {value}
 3. START r=rel({id})  RETURN id(r) as id, type(r) as type, r as properties, id(startNode(r)) as start, id(endNode(r)) as end
 4. **START r=rel({id})  SET r.`lang` = {value}** <-- here the lang property seems to be correctly set !
 5. START r=rel({id})  SET r = {props} <- here, props = {"_ _type_ _" : PersonToPersonTranslatedContent"}

所有这些REST调用都是在对personToPersonTranslatedContentRepository.save()的简单调用中完成的。我在调试模式下跟着白色rabit,这里是缩短的调用堆栈:

  • Neo4jEntityConverterImpl.write() - &gt; entityStateHandler.useOrCreateState() - &gt; RestAPICypherImpl.createRelationship()(对应子弹1
  • Neo4jEntityConverterImpl.write() - &gt; typeMapper.writeType() - &gt; RestAPICypherImpl.setPropertyOnEntity()(对应子弹2
  • Neo4jEntityConverterImpl.write() - &gt; sourceStateTransmitter.copyPropertiesTo() - &gt; persistentEntity.doWithProperties() - &gt; RestAPICypherImpl.setPropertyOnEntity()(对应子弹4
  • Neo4jEntityConverterImpl.write() - &gt; sourceStateTransmitter.copyPropertiesTo() - &gt; ((UpdateableState)target).flush() - &gt; RestAPICypherImpl.setPropertiesOnEntity()(对应子弹5

所以,在我看来,考虑到我所知道的以及我在调试过程中看到的内容,问题似乎是围绕&#34; propertyData&#34;在((UpdateableState)目标中使用的类RestEntity的属性).flush()!它始终保持值{&#34; _ 类型 _&#34; :PersonToPersonTranslatedContent&#34;}但从不包含我的&#34; lang&#34;属性。

注意:我的问题与此处3.3.0.M1 : Properties on RelationShipEntity not saved when using CypherRestGraphDatabase?解释的问题相同。他的帖子没有令人满意的答案。

你能帮助我(我猜他)吗?

Thx:)

13/07/15:更新

我终于通过使用以下方法解决了我的问题:

Map<String, Object> properties = new HashMap<>(); properties.put("lang", lang); properties.put("__type__", "UserToUserTranslatedContent");
neo4jOperations.createRelationshipBetween(neo4jOperations.getNode(user.getId()), neo4jOperations.getNode(translatedContent.getId()), RelationNames.TRANSLATION, properties);

但是简单的save()操作不能按预期工作仍然很奇怪

1 个答案:

答案 0 :(得分:0)

对于寻找解决方案的人,我做了一个关于这个问题的报告(https://jira.spring.io/browse/DATAGRAPH-699),并像以前一样快速使用SDN(&lt; 3.3.x)这样做:

从build.gradle中删除“spring-data-neo4j”和“spring-data-neo4j-rest”并添加以下行:

repositories {
        maven {
            url "https://jitpack.io"
        }
    }

dependencies {
    compile 'org.springframework:spring-orm:4.1.7.RELEASE'
    compile 'org.springframework:spring-aspects:4.1.7.RELEASE'
    compile 'com.github.nousmotards:spring-data-neo4j:3.3.1.NM1'
}

希望这将有助于实现真正的修复;)