agensgraph

Zie ook: Alpino-corpora in AgensGraph

Het invoeren van een corpus in AgensGraph is heel veel sneller dan in Neo4j, maar vooral query’s met complexe paden kunnen trager zijn. AgensGraph is vooral heel bruikbaar omdat het meerdere gebruikers met elk meerdere grafen kan hebben, en het is heel eenvoudig te gebruiken vanuit Go. De web-interface AgensBrowser is een stuk minder goed dan de web-interface van Neo4j.

AgensGraph is gebouwd op PostgreSQL. Hierdoor kun je Cypher combineren met SQL. Maar door de eigenaardigheden van SQL (zoals geïmplementeerd in PostgreSQL) wijkt de syntax voor Cypher op een paar punten af.

Hoofdletters in labels spelen geen rol. Alle hoofdletters worden omgezet naar kleine letters, tenzij het label tussen dubbele aanhalingstekens staat.

Strings dienen tussen enkele aanhalingstekens te staan.

Dit is correct in openCypher:

MATCH (tobias {name: 'Tobias'}), (others)
WHERE others.name IN ['Andres', 'Peter'] AND (tobias)<-[]-(others)
RETURN others.name, others.age;

In AgensGraph moet je dat zo doen:

MATCH (tobias {name: 'Tobias'}), (others)
WHERE others.name IN ['Andres', 'Peter'] AND EXISTS((tobias)<-[]-(others))
RETURN others.name, others.age;

openCypher:

MATCH (persons), (peter {name: 'Peter'})
WHERE NOT (persons)-[]->(peter)
RETURN persons.name, persons.age;

AgensGraph:

MATCH (persons), (peter {name:'Peter'})
WHERE NOT EXISTS((persons)-[]->(peter))
RETURN persons.name, persons.age;

Andere verschillen…

Relaties kunnen maar van één soort zijn. Wel kun je soorten definiëren met een of meer basissoorten. Bijvoorbeeld, als je vader en moeder definieert als afgeleid van ouder, dan kun je door te zoeken naar ouder zowel relaties van vader en moeder vinden. Direct zoeken op meer dan één relatie kan niet. Dit werkt niet in AgensGraph: match ()-[:vader|moeder]->()

Dit werkt in Neo4j:

match (x) where "Node" in labels(x) or "Word" in labels(x) return x;

In AgensGraph moet je het zo doen:

match (x) where any(i in labels(x) where i='node' or i='word') return x;

Als je alle variabelen wilt hebben, dan werkt dit ook:

match (w1:word{lemma:'fietsen'})<-[n:next*]-(w2:word{lemma:'gaan'}) return *;

Let op:

# drop graph if exists test cascade;
# create graph test;
# set graph_path='test';
# create (:foo);
# match (n:foo) where not (n.bar='test') return n;
 n
---
(0 rows)

# match (n:foo) where not (n.bar is not null and n.bar='test') return n;
     n
------------
 foo[3.1]{}
(1 row)

# drop graph test cascade;
agensgraph cypher