Spring neo4j пользовательский запрос и restful, узел автоматически сопоставляется с NodeEntity, но отношения не - PullRequest
0 голосов
/ 03 июня 2019

Я использую пользовательский запрос spring data neo4j и выставляю его в успокоительный API, но я не пишу QueryResult, а пишу соответствующие NodeEntity и RelationshipEntity бины, но только узел может быть сопоставленным с NodeEntity, отношение не может быть сопоставлено с RelationshipEntity

Я написал bean-компоненты NodeEntity и RelationshipEntity, репозиторий и пользовательский запрос, а также создал два узла и отношения в neo4j и контроллер покоя, чтобы показать json

во-первых, я создаю данные в neo4j:

   CREATE (n:Person2 { name: 'tom'})
CREATE (n:Person2 { name: 'jim'})
MATCH (a:Person2),(b:Person2)
 WHERE a.name = 'tom' AND b.name = 'jim'
 CREATE (a)-[r:Relation2 { name: 'onelink' }]->(b)
 RETURN type(r), r.name

затем напишите код, используя данные пружины:

@NodeEntity(label = "Person")
@Data
public class Person2 {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String personProp = "someone";

}

@RelationshipEntity(type = "Relation2")
@Data
public class Relation2 {
    @Id
    @GeneratedValue
    private Long id;

    private String r2prop="yeyeye";

    private String name;

}

Хранилище

public interface NeiborRepository extends Neo4jRepository {

    @Query("MATCH (n {name:'tom'})-[r]->(m {name:'jim'}) return n,r,m")
    Iterable<Map<String,Object>> neibor(String identifier);

}

Контроллер

@RestController
@RequestMapping(path = "/api")
public class Neo4jApi {

    private NeiborRepository neibor;
    @Autowired
    public Neo4jApi(NeiborRepository neibor) {
        super();
        this.neibor = neibor;
    }

    @GetMapping(path = "neibor")
    public  Iterable<Map<String, Object>> neibor(String identifier) {
        Iterable<Map<String, Object>> coms = neibor.neibor(identifier);
        return coms;
    }

}

Тогда я посещаю http://127.0.0.1:8080/api/neibor результат:

[{
    "n": {
        "id": 7206,
        "name": "tom",
        "personProp": "someone"
    },
    "r": {
        "id": 26,
        "version": null,
        "type": "Relation2",
        "startNode": 7206,
        "endNode": 21,
        "primaryIdName": null,
        "propertyList": [{
            "key": "name",
            "value": "onelink"
        }]
    },
    "m": {
        "id": 21,
        "name": "jim",
        "personProp": "someone"
    }
}]

Внимание на r.propertyList, для узла person все свойства взяты из bean-компонента Person2, даже отображается «personProp», но для отношения, похоже, он не соответствует bean-компоненту Relation2.

Итак, я пытаюсь изменить имя класса Person2 на Person3, результат json становится:

[{
    "n": {
        "id": 7206,
        "version": null,
        "labels": ["Person2"],
        "removedLabels": null,
        "primaryIndex": null,
        "propertyList": [{
            "key": "name",
            "value": "tom"
        }]
    },
    "r": {
        "id": 26,
        "version": null,
        "type": "Relation2",
        "startNode": 7206,
        "endNode": 21,
        "primaryIdName": null,
        "propertyList": [{
            "key": "name",
            "value": "onelink"
        }]
    },
    "m": {
        "id": 21,
        "version": null,
        "labels": ["Person2"],
        "removedLabels": null,
        "primaryIndex": null,
        "propertyList": [{
            "key": "name",
            "value": "jim"
        }]
    }
}]

Тогда я полагаю, данные пружины и пересчет отображают узел в bean-компонент класса Person2, потому что имя класса и метка узла оба Person2. но тип отношения Relation2, но он не сопоставлен с Relation2 классом компонента

Здесь, почему я не использую QueryResult, это отношения между человеком и человеком, иногда между человеком и компанией, я хочу написать только один API

Я использую весеннюю загрузку 2.0.4 и добавляю neo4j lombok web и devtool

Я ожидал, что он может вернуть json, как показано ниже:

[{
    "n": {
        "id": 7206,
        "name": "tom",
        "personProp": "someone"
    },
    "r": {
        "id": 26,
        "name": "onelink"
        "r2prop":"yeyeye"
    },
    "m": {
        "id": 21,
        "name": "jim",
        "personProp": "someone"
    }
}]
...