2014-07-21 43 views
7

Czy istnieje sposób na hierarchię typów modeli w Neo4j? Jeśli na przykład chcę zbudować hierarchię klas samochodów, mogę mieć podstawowy typ "samochodu", a następnie mieć podklasy, które ją rozszerzają, np. "SportCar", itp.Jak pracować z hierarchiami typów w Neo4j?

Chciałbym móc aby utworzyć instancje "SportCar", ale uruchom zapytanie, aby uzyskać wszystkie "samochody". czy to możliwe? Jeśli tak, to jaka jest technika?

Myślę, że próbuję stworzyć "hierarchię etykiet" - ale po prostu nie sądzę, że jest to obsługiwane w neo4j.

+0

Wydaje się być duplikatem http://stackoverflow.com/questions/21402271/do-having-multiple-labels-for-a-node-in-neo4j-make-any-sense – cybersam

+0

Jedna rzecz, jaką dowiedziałem się po przeczytaniu więcej o neo4j, że tak naprawdę nie istnieje system "typu". Najbliższą rzeczą, którą mają, są tak zwane "etykiety", które są po prostu "tagami", które można umieścić w węźle. Tak więc nawigacja w hierarchiach jest całkowicie wykonalna, ale musisz konstruować zapytania w bardziej specyficzny sposób, ponieważ nie ma opcji "out" dla innych typów, itp. –

+0

AgensGraph (rozszerzenie PostgreSQL rozszerzone o graficzną funkcjonalność DB) ma hierarchie etykiet: http : //www.agensgraph.com/agensgraph-docs/agensgraph_data_model.html#labels –

Odpowiedz

10

Paweł

pierwsze, polecam lekturę "Wykres baz danych", bezpłatne O'Reilly e-książki dostępne w this link.

Jako szybkie ukłucie odpowiedzi, istnieje wiele sposobów na zrobienie tego rodzaju rzeczy, a najlepszy wybór zależy od problemu, który próbujesz rozwiązać. Jednym ze sposobów byłoby skonstruować węzeł „Car”, a następnie powiązać swoje „sportcar” węzłów do węzła „car” z wpisanym relacji jak

CREATE (m:Car) 
MATCH (m:CAR) WITH m CREATE (n:SportCar)-[:IS_A]->(m) 

i tworzyć inne rodzaje samochodów, również odnosząc je do samochodu węzeł.

Następnie można znaleźć wszystkie samochody poprzez

MATCH (m:Car)<-[:IS_A]-(n) RETURN n 

Można też po prostu umieścić Car i sportcar (i LuxoCar, etc) etykiety na każdym węźle. To tylko dwa z wielu podejść.

Grace i spokoju,

Jim

+3

Wiem, że możesz zastosować relację "IsA" podczas tworzenia węzłów, ale to nie pozwala ci zrobić "MATCH" (c: Car) POWRÓT c "i odzyskanie wszystkich samochodów, w tym samochodów należących do klas samochodów. Po prostu nie sądzę, że neo4j obsługuje dziedziczenie w wyszukiwaniu. Dla jasności, OrientDB obsługuje to - co, jak sądzę, jest tylko kluczową różnicą między dwiema platformami. Ponadto podejście oparte na etykietach nie jest skalowane i byłoby bałaganem do zarządzania, gdy hierarchia się zmieni - wyobraź sobie, że musisz wrócić i zaktualizować wszystkie poprzednie etykiety itp. –

2

więc rzeczą szafy mogłem wymyślić jest to przykład.

Krok 1: Utwórz hierarchię typów typów samochodów.

create (c:CarType{Code:"Car"}) 
create (sc:CarType{Code:"SportCar"}) 
create (sc)-[:SubCarOf]->(c) 

Krok 2: Tworzenie instancji „sportcar” i zapis, że (za pośrednictwem właściwości związku) to „CarType”.

merge (sc:CarType{Code:"SportCar"}) 
create (i:SportCar) 
create (i)-[:CarType]->(sc) 

Krok 3: Napisz zapytanie, które wyszukuje wszystkie „CarType” s, które wynikają z „samochód”, a te, które są po prostu typu „samochód”, a następnie znaleźć wystąpień tych.

match (c)-[:CarType]->(ct:CarType{Code:"Car"}) 
return c as Car 
union 
match (sct)-[:SubCarOf*]->(ct:CarType{Code:"Car"}), 
(c)-[:CarType]->(sct) 
return c as Car 
1

Istnieją co najmniej dwa sposoby, aby to zrobić:

1) korzystać z wielu lables dla każdego obiektu

CREATE(BMW325d:Car:PassengerCar:DieselCar) 
CREATE(Porsche911:Car:SportsCar:...) 

2) Tworzenie ontologii

Drugi sposób modelowania hierarchii klas wykorzystuje ontologie. Chociaż dane modeli Neo4j jako wykres właściwości i ontologie są bardziej odpowiednie dla RDF Triple Stores, istnieją sposoby ich wykorzystania.

Możesz stworzyć ontologię za pomocą Protégé (Open Source). Następnie zapisujesz Ontology w pliku .owl i przesyłasz go do Neo4j przy użyciu tego Plugin. Pozdrowienia potwierdzasz swoje węzły w Neo4j do Metagrapha stworzonego w Protégé. Bardziej szczegółowy opis jest opisany here.

więcej na ten temat ...

Dla swoich celów RDF Triple Store jest ciekawym rozwiązaniem, escpecially jeśli chcesz dodać do semantyki dane lubią używać wnioski i dziedziczenia. Polecam przyjrzeć się bliżej RDF Triple Stores, które są również wykresami - ale przechowują dane w trójek (subject - predicate - object) zamiast węzłów i relacji. Top Braid Composer jest "łatwym do nauczenia się" - narzędziem do rozpoczęcia pracy z nimi.

Chociaż mam nadzieję, że luka między wykresami właściwości i potrójnymi sklepami RDF wkrótce się zmniejszy w momencie, gdy jest to kompromis. W związku z tym powinieneś starannie ustawić swoje wymagania w bazie danych przed wybraniem jednego z nich.

Mam nadzieję, że to pomoże.