2013-05-29 24 views
12

Mam stosunkowo duży zestaw węzłów i chcę znaleźć wszystkie pary węzłów, które mają pasujące wartości właściwości, ale nie wiem z góry lub nie zważam, jaka jest wartość właściwości. Jest to w zasadzie próba znalezienia zduplikowanych węzłów, ale mogę ograniczyć definicję duplikatu do dwóch lub więcej węzłów, które mają tę samą wartość właściwości.neo4j znajdź wszystkie węzły o pasujących właściwościach

Jakieś pomysły, jak postępować? Nie znaleziono żadnych punktów początkowych w dokumentach neo4j. Jestem na edycji społeczności 1.8.2.

EDIT
Przepraszam za nie jest jasne, w pierwszym pytaniu, ale mówię o zrobieniu tego przez Cypher.

Odpowiedz

0

Najlepszą/najłatwiejszą opcją jest zrobienie czegoś takiego jak lokalny Map. Jeśli zrobiłeś coś takiego, możesz utworzyć kod taki jak ten:

GlobalGraphOperations ggo = GlobalGraphOperations.at(db); 
Map<Object, Node> duplicateMap = new HashMap<Object, Node>(); 

for (Node node : ggo.getAllNodes()) { 
    Object propertyValue = node.getProperty("property"); 
    Node existingNode = duplicateMap.get(propertyValue); 
    if (existingNode == null) { 
     duplicateMap.put(propertyValue, node); 
    } else { 
     System.out.println("Duplicate Node. First Node: " + existingNode + ", Second Node: " + node); 
    } 
} 

Zostanie wydrukowana lista. Jeśli chcesz zrobić więcej, na przykład usunąć te węzły, możesz zrobić coś w innym.

Czy znasz nazwę nieruchomości? Czy będzie to wiele właściwości, czy tylko duplikaty pojedynczej pary nazwa/wartość? Jeśli robisz wiele nieruchomości, po prostu utwórz mapę dla każdej posiadanej nieruchomości.

+0

wiem nazwę właściwości, ale staram się to zrobić za pomocą szyfru, jeśli to możliwe, b/c Nie używam klienta java, a moja aplikacja konsumująca komunikuje się z serwerem za pomocą apletów REST i kwerend szyfrowych. – Paul

+0

Problem polega na tym, że będziesz musiał użyć pętli, chyba że masz te węzły indeksowane na nazwie właściwości. Jeśli masz je zaindeksowane, możesz przechodzić przez każdy węzeł i sprawdzać indeks, jeśli dla danej właściwości jest zwróconych więcej niż 1 węzłów. – Nicholas

2

Co o następującym podejściu:

  • użytku getAllNodes uzyskać iterowalny nad wszystkimi węzłami.
  • przy użyciu getPropertyKeys i getProperty(key) zbudować java.util.Map zawierające wszystkie właściwości dla węzła. Oblicz mapa na hashCode()
  • zbudować globalną Map pomocą hashCode jako klucz oraz zestaw node.getId() jako wartości

To powinno dać kandydatów do bycia duplikatem. Bądź świadomy semantyki hashCode(), mogą istnieć węzły o różnych właściwościach odwzorowujących ten sam kod haszujący.

+3

Nie używając języka Java jak podano powyżej. Ponadto mam ponad 20 000 węzłów; Miałem nadzieję na coś bardziej wydajnego niż pętla. – Paul

0

Można również użyć indeksu dla tej właściwości. Następnie dla danej wartości pobierz wszystkie węzły. Zaletą jest to, że można również zapytać o przybliżenie wartości.

+0

Jak możesz tego użyć? – Automatico

2

Możesz spróbować tego, który robi, co myślę, robi, co chcesz.

START n=node(*), m=node(*) 
WHERE 
    HAS(n.name) AND HAS (m.name) AND 
    n.name=m.name AND 
    ID(n) <ID(m) 
RETURN n, m 

http://console.neo4j.org/?id=xe6wmt

Oba węzły powinny mieć właściwość name. name powinny być równe dla obu węzłów i chcemy tylko jednej pary dwóch możliwości, które otrzymujemy poprzez porównanie id. Nie jestem pewien co do wydajności - sprawdź.

+0

wygląda obiecująco, spróbuję, dziękuję. – Paul

19

Cypher policzyć wartości na nieruchomości, wracając zbiór węzłów, a także:

start n=node(*) 
where has(n.prop) 
with n.prop as prop, collect(n) as nodelist, count(*) as count 
where count > 1 
return prop, nodelist, count; 

przykład na konsoli: http://console.neo4j.org/r/k2s7aa

Można również wykonać skanowania indeksu z nieruchomości jak tak (do uniknąć patrząc na węzłach, które nie mają tej własności):
start n=node:node_auto_index('prop:*') ...

2,0 Cypher z etykietą label:

match (n:Label) 
with n.prop as prop, collect(n) as nodelist, count(*) as count 
where count > 1 
return prop, nodelist, count; 
+0

W wersji Neo4j 2.0.0-M06 pojawia się błąd składniowy informujący, że potrzebuję() wokół wzorca dopasowania. Na przykład: match (n: Label). – holaSenor

+0

tak, od M06, które jest wymagane. dzięki. Zaktualizuję. –

0

Neo4j 3.1.1

nie ma już obsługiwana w Cypher, użyj zamiast EXISTS.

Jeśli chcesz odnaleźć węzły z konkretnej nieruchomości, Cyper się następująco:

MATCH (n:NodeLabel) where has(n.NodeProperty) return n 
Powiązane problemy