Code Monkey home page Code Monkey logo

ontouml-js's Introduction

OntoUML

Build Status Documentation Status LICENSE GitHub issues

Evolvable OntoUML specification

Usage

pip install -r requirements.txt
make html

Contributing

You are free to contribute in a standard way for GitHub - via discussions in issues and by proposing changes in pull requests. For more, read provided contributing guidelines.

Acknowledgements

Making OntoUML documentation evolvable via Sphinx and custom extensions was support by FIT CTU in Prague.

ontouml-js's People

Contributors

claudenirmf avatar dependabot[bot] avatar guidoni avatar guylerme avatar lucasbassetti avatar matt-81 avatar tgoprince avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

ontouml-js's Issues

Error gUFO Triggering/Causal Likelihood

When I export ROSE to .ttl using the plugin, two classes show a sort of error in Protégé: Triggering Likelihood is shown to be subsumed by Error1, whilst causal Likelihood is shown to be subsumed by Error2.
You can test this by yourself simply exporting the aforementioned .vpp file to .ttl using the plugin, and open it using Protégé.

relover antipattern, first test failure

We have generated the first test to identify an occurrence of RelOver anti-pattern (variation 1, from DKE2015, where the targets of mediation relations are overlapping, i.e., share a common parent class).

With the current setting the result of the test is as follows:

  • Test Suites: 1 failed, 1 passed, 2 total
  • Tests: 2 failed, 1 passed, 3 total

With the following output:

  1. RelOver Test › should find the RelOver occurrence
    expect(received).toHaveLength(expected)

    Expected length: 1
    Received length: 0
    Received array:  []

      28 | 
      29 |   it('should find the RelOver occurrence', () => {
    > 30 |     expect(output.result).toHaveLength(1);
         |                           ^
      31 |   });
      32 | 
      33 |   it('should set «relator» Supervision in the RelOver occurrence', () => {

      at Object.<anonymous> (__tests__/libs/antipattern/general.test.ts:30:27)
  1. RelOver Test › should set «relator» Supervision in the RelOver occurrence:
    TypeError: Cannot read property 'relator' of undefined

      33 |   it('should set «relator» Supervision in the RelOver occurrence', () => {
      34 |     const relover: RelOverOccurrence = output.result[0]; //this means that the output is an array
    > 35 |     expect(relover.relator).toEqual(supervision);
         |                    ^
      36 |   });
      37 | });
      38 | 

I would need help to precisely understand the error (actually, thanks to @claudenirmf we discovered what causes the issue and I commented on the related code lines, see test file). However, I am still trying to precisely figure out the issue, thus being able to address it.

Thanks in advance for your help :)

add annotations

Add the following annotations:

  • Language fields in "propertyAssignments", i.e., named "en", "pt", "it", "de", "nl" become rdfs:label @
  • "description" becomes rdfs:comment

Invalid URIs in the catalog's ttl files

The ttl files (catalog.ttl, metadata.ttl, etc.) generated by the ontouml2owl-batch refer to invalid dataset URIs.

For example, when referring to the bank-model, we have the following situation:

For the correction, please note that it is necessary to:

  1. remove the "/dataset/" substring
  2. remove the final "/"

Can you please correct that?

alternative relations transformation

This feature consists of omitting the creation of object properties for some OntoUML relations, and only creating the cardinality restrictions.

The relations affected by this feature are those which reflect existential dependencies, namely:

  • characterization
  • externalDependence
  • mediation
  • creation
  • historicalDependence
  • manifestation
  • participation
  • participational
  • termination
  • instantiation

But also the following relations in which readOnly is set in at least one association end, which include:

  • componentOf
  • memberOf
  • subCollectionOf
  • subQuantityOf
  • composition between events (it has no stereotype)

Generated files metadata.ttl has a useless invalid prefix

All metadata.ttl files generated by the ontouml2owl-batch contain a useless invalid prefix. The situation happens in the file located in the root directory and in all files generated for each dataset.

The problems is: @prefix dataset: <https://purl.org/ontouml-models/dataset/> .

Can you please correct that? The solution is simply to remove the prefix. No other action is necessary.

Pre-transformation analysis

Add parameter to enable pre-transformation analysis to give users feedback about things that could potentially impact the transformation.

Including:

  • Name suggestion
  • Repeated names (attributes, relation names and association ends, etc.)
  • Plural association ends

Example

preAnalysis: true

Get Source Cardinality

Just to keep track of an issue we already discussed.
At the current state, to get relation cardinalities information we have to get the relation properties and then get information about cardinalities.
It would be nice in the future to get information directly from a relation type.

Ease JSON Schema requirements

As currently implemented, the JSON schema for OntoUML projects prevents empty arrays and strings to improve data quality. However this makes it harder to serialize projects that could still be processed otherwise.

We must ease these restrictions and, additionally, make not all properties names required properties.

Transformation of relations to gUFO collapse "direct" and inverse properties as the same subject if there is no name

When a relation is transformed to gUFO and it does not have a name (or the name is equal to the generated one), the resulting object property for the direct and inverted "direction" becomes the same. See below the input model and the following OWL declaration (the relevant excerpt).

image

:Belief rdf:type owl:Class, gufo:Kind, owl:NamedIndividual;
    rdfs:subClassOf gufo:IntrinsicMode;
    rdfs:label "Belief"@en.
:Person rdf:type owl:Class, gufo:Kind, owl:NamedIndividual;
    rdfs:subClassOf gufo:FunctionalComplex;
    rdfs:label "Person"@en.
:beliefInheresInPerson rdf:type owl:ObjectProperty;
    rdfs:domain :Belief;
    rdfs:range :Person;
    rdfs:label ""@en;
    rdfs:subPropertyOf gufo:inheresIn;
    rdf:type owl:ObjectProperty;
    rdfs:range :Belief;
    rdfs:domain :Person;
    rdfs:subPropertyOf <gufoi:bears>.

Discussion initiated on this issue.

Fix ontouml2gufo's bugs and shortcomings

List of bugs and shortcomings of the ontouml2gufo transformation:

  • Missing support for prefix definition

  • Bad name normalization for URIs: «roleMixin» CorporateCustomer becomes :Corporatecustomer

  • Missing support for some ontological natures (e.g. extrinsic mode, abstract). These natures were recently introduced in the language.

  • Disjoint generalization sets involving antirigid and semirigid types should not generate disjointness constraints in OWL, which look like:

    [ rdf:type owl:AllDisjointClasses ] owl:members (:Adult :Child) . 
    

    Instead, the disjointness should become a rule concerning TemporaryInstantiationSituations referring to those classes (which cannot be done in OWL, but maybe in SWRL?)

parameter to create prefixes for sub-packages

Currently we have:

prefixes: {
  ['']: `${baseIRI}#`,
  gufo: 'http://purl.org/nemo/gufo#',
  ....
},

This new parameter will allow us to have a prefix for each package. Like so:

Example:

prefixes: {
  pk1: `${baseIRI}/${packageName1}#`,
  pk2: `${baseIRI}/${packageName2}#`,
  gufo: 'http://purl.org/nemo/gufo#',
  ....
},

historicalRoles are not being properly transformed

The ontouml2gufo transformation is ignoring classes stereotyped as <<historicalRole>>.

A <<historicalRole>> should be transformed exactly as a <<role>>:

  • It should instantiate owl:Class, owl:NamedIndividual, and gufo:Role
  • It should be a subclass of gufo:Endurant

:Participant rdf:type owl:Class .
:Participant rdf:type owl:NamedIndividual .
:Participant rdf:type gufo:Role .
:Participant rdfs:subClassOf gufo:Endurant .

Naturally, it should also follow the basic class transformation pattern.

Generated file catalog.ttl has invalid syntax

The catalog.ttl file generated by the ontouml2owl-batch function is reporting a syntax problem at line 11.

The problem is: ERROR: Expected IRI to follow prefix "foaf:" on line 11.
Line 11 is: @prefix foaf: <<http://xmlns.com/foaf/0.1/>.

Note that a double < char is used.

Can you please correct that? The solution is remove the double char, leaving only one.

Datatypes with attributes generate inconsistent OWL model

Consider the OntoUML model fragment below:

Schermata 2020-03-20 alle 21 16 41

The serialization of this model is at the end of this issue.

This generates inconsistencies on the three attributes of the RGB datatype, namely red, green, and blue.

This is the code that is generated for them:

:red rdf:type owl:DatatypeProperty;
    rdfs:subPropertyOf gufo:hasQualityValue;
    rdfs:domain :Rgb;
    rdfs:range xsd:int;
    rdfs:label "red".
:green rdf:type owl:DatatypeProperty;
    rdfs:subPropertyOf gufo:hasQualityValue;
    rdfs:domain :Rgb;
    rdfs:range xsd:int;
    rdfs:label "green".
:blue rdf:type owl:DatatypeProperty;
    rdfs:subPropertyOf gufo:hasQualityValue;
    rdfs:domain :Rgb;
    rdfs:range xsd:int;
    rdfs:label "blue".

Note that :red, :green, and :blue are sub-properties of gufo:hasQualityValue that have :Rgb as their domain.

This is an issue because gufo:hasQualityValue has gufo:ConcreteIndividual as its domain, and :Rgb is a subtype of gufo:AbstractIndividual.

The solution is to transform datatype attributes simply as datatype properties that DO NOT specialize gufo:hasQualityValue.

{
  "type": "Package",
  "id": "dvqJnw6GAqACBAj5",
  "name": "AttributeDatatype",
  "description": null,
  "contents": [
    {
      "type": "Class",
      "id": "7vqJnw6GAqACBAj_",
      "name": "int",
      "description": null,
      "properties": null,
      "literals": null,
      "propertyAssignments": null,
      "stereotypes": [
        "datatype"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Class",
      "id": "qCGJnw6GAqACBAyA",
      "name": "Object with Quality",
      "description": null,
      "properties": null,
      "literals": null,
      "propertyAssignments": null,
      "stereotypes": [
        "kind"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Class",
      "id": "xpOJnw6GAqACBAyf",
      "name": "Color",
      "description": null,
      "properties": [
        {
          "type": "Property",
          "id": ".W5Jnw6GAqACBAzV",
          "name": "valueInRGB",
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "O5VJnw6GAqACBAz1"
          },
          "cardinality": null,
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        }
      ],
      "literals": null,
      "propertyAssignments": null,
      "stereotypes": [
        "quality"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Class",
      "id": "O5VJnw6GAqACBAz1",
      "name": "RGB",
      "description": null,
      "properties": [
        {
          "type": "Property",
          "id": "ePdJnw6GAqACBA0G",
          "name": "red",
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "7vqJnw6GAqACBAj_"
          },
          "cardinality": null,
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        },
        {
          "type": "Property",
          "id": "os9Jnw6GAqACBA0K",
          "name": "green",
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "7vqJnw6GAqACBAj_"
          },
          "cardinality": null,
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        },
        {
          "type": "Property",
          "id": "wx9Jnw6GAqACBA0O",
          "name": "blue",
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "7vqJnw6GAqACBAj_"
          },
          "cardinality": null,
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        }
      ],
      "literals": null,
      "propertyAssignments": null,
      "stereotypes": [
        "datatype"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Class",
      "id": "tQopnw6GAqACBA2x",
      "name": "Object with Attribute",
      "description": null,
      "properties": [
        {
          "type": "Property",
          "id": "qacpnw6GAqACBA3T",
          "name": "colorInRGB",
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "O5VJnw6GAqACBAz1"
          },
          "cardinality": null,
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        }
      ],
      "literals": null,
      "propertyAssignments": null,
      "stereotypes": [
        "kind"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Class",
      "id": "gEOpnw6GAqACBA4q",
      "name": "Object with Association",
      "description": null,
      "properties": null,
      "literals": null,
      "propertyAssignments": null,
      "stereotypes": [
        "kind"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Relation",
      "id": "uVXJnw6GAqACBA1G",
      "name": null,
      "description": null,
      "properties": [
        {
          "type": "Property",
          "id": "uVXJnw6GAqACBA1H",
          "name": null,
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "xpOJnw6GAqACBAyf"
          },
          "cardinality": "1",
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        },
        {
          "type": "Property",
          "id": "uVXJnw6GAqACBA1J",
          "name": null,
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "qCGJnw6GAqACBAyA"
          },
          "cardinality": "1",
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": true,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        }
      ],
      "propertyAssignments": null,
      "stereotypes": [
        "characterization"
      ],
      "isAbstract": false,
      "isDerived": false
    },
    {
      "type": "Relation",
      "id": "5zhpnw6GAqACBA5U",
      "name": null,
      "description": null,
      "properties": [
        {
          "type": "Property",
          "id": "5zhpnw6GAqACBA5V",
          "name": null,
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "gEOpnw6GAqACBA4q"
          },
          "cardinality": "0..*",
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        },
        {
          "type": "Property",
          "id": "5zhpnw6GAqACBA5X",
          "name": "hasValueInRGB",
          "description": null,
          "propertyType": {
            "type": "Class",
            "id": "O5VJnw6GAqACBAz1"
          },
          "cardinality": "1",
          "isDerived": false,
          "isOrdered": false,
          "isReadOnly": false,
          "stereotypes": null,
          "propertyAssignments": null,
          "subsettedProperties": null,
          "redefinedProperties": null,
          "aggregationKind": "NONE"
        }
      ],
      "propertyAssignments": null,
      "stereotypes": null,
      "isAbstract": false,
      "isDerived": false
    }
  ],
  "propertyAssignments": null
}

Suggestion for nomenclature.

Evaluate the possibility of transformation to gUFO to allow the occurrence of uppercase letters and underline (_) in the middle of the names given in the OntoUML model.

At.
Guidoni

Align Stereotypes Service

Two common problems in the migration of older OntoUML ontologies are (i) the inconsistent spelling of stereotypes in the original ontology (e.g., «subkind», «subKind», and «sub kind»), and (ii) the usage of stereotypes that must be mapped to a version adopted more recently (e.g., «powertype», «high-order type», and «type»).

This issue concerns the creation of an "alignment service" that receives a given ontology and returns it with corrected stereotypes on all elements. These corrections are limited to misspelled and mapped stereotypes. Stereotypes that cannot match some of the current OntoUML stereotypes in one of these two ways shall be left as is.

One other correction that may be considered in this context is the inversion of association directions to the direction prescribed by OntoUML. For instance, an association decorated with the stereotype «mediation» may only be defined with the relator at its source, and not a substantial. However, this is could be considered a modification that is too invasive, or even unintuitive to the user.

Add rules for associations in the syntax verification service

The rule should check things like:

  • The ontological nature of the relata (e.g. componentOf must connect functional complexes)
  • The direction (e.g. a relator must be the source of a mediation)
  • The meta-properties (e.g. isReadOnly = true on the target end of a mediation)
  • The cardinalities

The transformation to gUFO is generating the same label for two different "things".

The association name is being referenced in the label for the association name and for the class name to which it relates.

For exemple: the label "hasEmployee" appears in the turtle file for the class "Employee" and for the association "hasEmployee", as shown in the fragment below.

"......
[ rdf:type owl:AllDisjointClasses ] owl:members (:Enrollment :Supplycontract :Employment).
:Employee rdfs:subClassOf :Adult.
:Customer owl:equivalentClass [
rdf:type owl:Class;
owl:unionOf (:Corporatecustomer :Personalcustomer)
].
:Hasemployee rdfs:label "hasEmployee".
:Employee rdf:type gufo:Role.
[ rdf:type owl:AllDisjointClasses ] owl:members (:Adult :Child).
:Employee rdfs:label "Employee".
:Person owl:equivalentClass [
rdf:type owl:Class;
owl:unionOf (:Adult :Child)
].
:employee rdfs:label "hasEmployee".
[ rdf:type owl:AllDisjointClasses ] owl:members (:Organization :Person).
......"

Add methods to check the disjointness between classifiers

Given two (or more) classifiers, evaluate whether they are disjoint. Disjointness checks between more than two classes, if necessary, must be clear about the implementation (i.e., pairwise or overall disjointness).

areDisjoint(classifierA : Classifier, classifierB : Classifier): boolean;
areDisjoint(...classifiers : Classifier[]): boolean;
arePairwiseDisjoint(...classifiers : Classifier[]): boolean;

Some questions and suggestions

After some inspection of the owl conversion of the Conceptual Model made in Onto-UML, I have some questions and suggestions.:

-Apparently, multiple asserted class inheritance is allowed in Onto-UML. As such, there is also multiple asserted class inheritance in OWL. See for example: #Organisation which is modeled as subclass of #Agent and #FunctionalComplex. This implies that the class #Organization is shown twice when the model is loaded in Protege without any marker that these classes are equivalent. Is there a way to fix this, e.g. by preventing multiple class inheritance or by making the class equivalence explicit in OWL?

Modeling ’true’ individuals in the gufo subhierarchy of gufo#Individual. Is it possible to state in Onto-UML that some entity is an individual and not a concept? In the conversion, I see Named Entities such as ‘CAK’, ‘SVB’ which are names of specific organisations as classes. I would like to be able to say that these are individuals of #Organization.

-To the best of my understanding, Onto-UML is not geared towards a hierarchical modelling of concepts. As a result, the OWL conversion shows a rather flat hierarchy where I suppose that a deeper hierarchy is possible which has its benefits from a concise modelling perspective. See for example: #Inhabitant, #BSN holder, #Resident of The Netherlands, #Non-Resident, #Dutch Citizen which are sibling classes now.

-Is it possible to enforce in some way in Onto-UML that generic object properties such as #livesIn are defined with a domain and range at the highest possible level in the class hierarchy? In this case, the domain and range are (erroneously) defined as #ResidentInHealthcareInstitution and HealthcareProvider, while I suppose that this property generically applies between #Person and #Location.
Or, if one adheres to minimal ontological commitment, would it be possible to avoid domain and range and opt for a property restriction in the conversion of Onto-UML to gufo.owl?

-Is it possible to make e.g. symmetric properties explicit as such? See for example #partnerOf and #marriedTo.

Information about available ontouml-js methods and usage examples

I was looking for a list of the available ontouml-js methods (e.g., Package.createKind) with, possibly, also hints about how they can be used.

I mean something like what is available for the jest methods at https://jestjs.io/docs/expect (e.g., toHaveLength).

By using "control" over a method I can already see some useful info about it, but I was wondering whether there is something where I can check a full list of the available options + example

Thanks!

Plural names check not working properly

The verification feature that checks if a class has a plural name is not working properly. It is complaining about a lot of cases which it should not.

See example below:

image

The class "Resident of the Netherlands" is not a plural name, as well as "Child Living with Parents".

Incorrect transformation of <<derivation>> relations

The transformation from OntoUML to gUFO is not transforming <<derivation>> relations correctly.

It is creating sub properties of gufo:isDerivedFrom instead of using it.

Let's use the following model as a reference:

derivation

The currently output regarding derivations is:

:isDerivedFromKg9rei6gaqaccwic rdf:type owl:ObjectProperty;
    rdfs:comment "Relation URI was automatically generated.".
:isDerivedFromMotbei6gaqaccwn2 rdf:type owl:ObjectProperty;
    rdfs:comment "Relation URI was automatically generated.".
:Person_EoyrEI6GAqACCWes rdf:type owl:Class, owl:NamedIndividual;
    rdfs:label "Person".
:isDerivedFromGek7ei6gaqaccwqr rdf:type owl:ObjectProperty;
    rdfs:comment "Relation URI was automatically generated.".generated." .

(These weird character sequences at the end of the properties URIs are the ids of the original derivations).

Instead, it should generate the following statements:

:WorksAt gufo:isDerivedFrom :EmploymentContract .
:Loves gufo:isDerivedFrom :Love .
:HeavierThan gufo:isDerivedFrom :Weight .

No object properties should be created!

PS: This example highlights another small bug: relation URIs should be generated in lowerCamelCase not CamelCase. In our example, we should generate :worksAt, :loves and :heavierThan

transformation of part-whole relation between events (it has no stereotype)

This feature consists in transformation part-whole relations between events (association end has readOnly = true in one side -- the whole).

It should create an object property specializing gufo:isEventProperPartOf.

Note that the association end in which aggregationKind=shared or aggregationKind=composite identifies the whole, which should be the range of gufo:isEventProperPartOf.

Please also check if the other part-whole relations are correctly transformed according to this logic.

Example:

:event1 :relation :event2

:relation rdf:type owl:ObjectProperty ;
          rdfs:subClassOf gufo:isEventProperPartOf ;
          rdfs:domain :event2 ;
          rdfs:range :event1 .

Add method to retrieve a classifier's taxonomy

Add method to retrieve a classifier's taxonomy, i.e., an array of all classifiers that may apply to instances of the given classifier. This method must check orthogonal hierarchies among its ancestors, and consider the disjointness of generalization sets, ultimate sortals, and ontological natures.

getTaxonomy(): Classifier[];

Add minimal checks for missing references

After the the update to the JSON Schemas on #65, elements may lack references that were required before. For exempla, it is possible to serialize a generalization with no references to general or specific classes/relations.

Add minimal checks on required reference on elements. Raise error issues when detecting missing relations.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.